-
-
[原创]2017秋季赛第二题Writeup
-
发表于: 2017-10-27 12:04 3290
-
感慨一下,作者声东击西的思路真**清奇。简单说一下解题思路,程序真正的校验逻辑被隐藏了,解题的关键是找到真正的校验过程,然后反推key。
主函数的逻辑很清晰,但这是作者给少年们下的套,因为checkA_401090处的限制条件和checkB_4010E0处的限制条件是自相矛盾的,所以找不到解能通过这段校验。
这是第一个线索,读取用户输入的代码存在栈溢出,并且可以劫持返回地址,所以程序的执行流是可以重定向的,这也暗示了另一个校验过程的存在:
相信很多少年都使用不可显示字符本地过了校验,但按照比赛规则,最终的flag只能包含字母和数字,所以无法提交。
其实可显示字符这一个条件指出了隐藏代码所在的区域。猜测作者把真正的校验逻辑藏在某个地址,然后通过栈溢出漏洞劫持控制流,跳转过去执行,由于覆盖的地址来自用户输入,所以跳转的地址一定可以看成数字/字母ASCII编码的组合。这是第二个线索。
然后很蛋疼的事情就来了,在公司加班,搜索各种可疑指令的机器码,找了一晚上,没找到...
回家之后又玩了一会儿,笔记本上只有windbg,反正没有反调试就走起了。突然想起来IDA里有一块很可疑的区域:
0x31是数字“1”的ASCII编码,0x41是字母“A”的ASCII编码,这地址来的太诡异了,像是精心设计的,正好匹配第二条线索。并且递归下降的IDA没有识别出.text段的这段内容,说明正常执行流程很可能不会光顾这里,这又很符合第一条线索。
其实,我看这段东西不爽很久了...
很自然的,把溢出地址换成“11A”(0x413131)试了一下,发现跳转后的指令先调整了esp寄存器,并且正好保护了我们的输入:
后面两个条件跳转,有很明显的花指令特征。
然后......就没有然后了。
写到这儿感觉差不多了,基本玩躲猫猫的整个心路历程都在这里了。感谢作者的精心设计,厘清思路之后,感觉真的蛮好玩的。
这段就简略的过了,动态调试,真正的校验过程和之前那个伪造的很像,只是需要解三个方程。写个Python脚本计算一下,输入key:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [原创]2017秋季赛第二题Writeup 3291
- [翻译]IoT设备固件分析教程之固件是怎么存储的 20966
- [原创]ARM汇编基础教程番外篇——配置实验环境 27051
- [翻译]ARM汇编基础教程——ARM指令集 12874
- [翻译]ARM汇编基础教程——数据类型和寄存器 11564