这题很简单,最终的做题人数也体现了这一点。。
不过前段时间刚接触了Ponce这一IDA插件神器,就试一试比赛里好不好使。(主要就是懒,不想逆向分析算法了)
main:
打印第8行puts,似乎就是success的意思;
看一下前面的vm_operad:
一个大while(1)循环,但对于Ponce来说,只需关心哪里输入,哪里success,哪里wrong。
这里的26行read函数就是要求输入长度为15
OK,开始下断点调试
首先,在scanf函数后一行下个断点,方便在栈中找到输入的数据
之后在printf("what a shame...");exit();那里的判断语句处下个断点,方便Ponce的使用
之后打开Ponce,选择Symbolic engine(符号引擎)
OK后开始调试,输入15个字符来到第一个断点
数据跟随,找到输入字符串的位置(0x0061FBC3-0x0061FBD1)
ctrl+shift+M将其转化为符号
之后F9运行来到另一个断点
这时程序会走右边也就是exit(),毕竟输入的不对嘛。
先用Ponce分析得到这一位正确的答案,再通过修改EIP让程序往左走,继续下一次循环。
这时Ponce就分析出了第一位的正确答案 7(Output)
之后就修改EIP让程序往左走继续循环,重复上面的操作,记录下每一次的最后一位,组合在一起就能获得15位的flag了。
例:
757515121f3d478,提交时加上flag{}
Ponce插件下载:https://github.com/illera88/Ponce