-
-
[原创]第二题WriteUp
-
2017-10-27 22:29 2333
-
非常坑爹的题目……
乍一看程序流程很清晰,输入一个字符串,拆成两段,对对应的两个整数进行二元一次线性运算并比对。
使用z3解方程,然而……解出来带小数
改变思路,输入的字符到第12个字符以后,会栈溢出,覆盖返回地址,从而控制程序流程。
正好程序从0x413131开始,有大段的代码没有用到,故输入随便12个字符+11A来跳转。
从413131开始先是重新开了一个栈,然后有大量的跳转和花指令,故利用IDA的Trace来跟踪程序真实流程。
第一个真正的check点
设三段对应的整数分别为x, y, z, 有
(x - y) * 4 + x + z == 0xEAF917E2
构造一组满足不定方程的解,继续跟踪
第二个check点
方程为 (x - y) * 3 + x + z == 0xE8F508C8
由已知的两个方程可以解得x - y == 0x02040F1A, x + z == 0xE2E8DB7A
根据以上条件构造一组不定方程的解,继续跟踪
第三个check点
方程为 (x - y) * 3 + x - z == 0x0C0A3C68
根据已知条件解得 x - z == 0x05FE0F1A
联立x + z, x - z, 解得 x = 0x7473754A, z = 0x6e756630
再与x - y联立,解得y = 0x726f6630
连起来,为Just0for0fun,再加上11A,flag即为Just0for0fun11A
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
赞赏
他的文章
看原图