首页
社区
课程
招聘
[原创]2017秋季赛第二题Writeup
发表于: 2017-10-27 12:04 3278

[原创]2017秋季赛第二题Writeup

2017-10-27 12:04
3278

感慨一下,作者声东击西的思路真**清奇。简单说一下解题思路,程序真正的校验逻辑被隐藏了,解题的关键是找到真正的校验过程,然后反推key。

主函数的逻辑很清晰,但这是作者给少年们下的套,因为checkA_401090处的限制条件和checkB_4010E0处的限制条件是自相矛盾的,所以找不到解能通过这段校验。

这是第一个线索,读取用户输入的代码存在栈溢出,并且可以劫持返回地址,所以程序的执行流是可以重定向的,这也暗示了另一个校验过程的存在:

相信很多少年都使用不可显示字符本地过了校验,但按照比赛规则,最终的flag只能包含字母和数字,所以无法提交。

其实可显示字符这一个条件指出了隐藏代码所在的区域。猜测作者把真正的校验逻辑藏在某个地址,然后通过栈溢出漏洞劫持控制流,跳转过去执行,由于覆盖的地址来自用户输入,所以跳转的地址一定可以看成数字/字母ASCII编码的组合。这是第二个线索。

然后很蛋疼的事情就来了,在公司加班,搜索各种可疑指令的机器码,找了一晚上,没找到...

回家之后又玩了一会儿,笔记本上只有windbg,反正没有反调试就走起了。突然想起来IDA里有一块很可疑的区域:

0x31是数字“1”的ASCII编码,0x41是字母“A”的ASCII编码,这地址来的太诡异了,像是精心设计的,正好匹配第二条线索。并且递归下降的IDA没有识别出.text段的这段内容,说明正常执行流程很可能不会光顾这里,这又很符合第一条线索。

其实,我看这段东西不爽很久了...

很自然的,把溢出地址换成“11A”(0x413131)试了一下,发现跳转后的指令先调整了esp寄存器,并且正好保护了我们的输入:

后面两个条件跳转,有很明显的花指令特征。

然后......就没有然后了。

写到这儿感觉差不多了,基本玩躲猫猫的整个心路历程都在这里了。感谢作者的精心设计,厘清思路之后,感觉真的蛮好玩的。

这段就简略的过了,动态调试,真正的校验过程和之前那个伪造的很像,只是需要解三个方程。写个Python脚本计算一下,输入key:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//