-
-
[原创]看雪.TSRC 2017CTF秋季赛第二题WP
-
发表于: 2017-10-27 13:30 2955
-
IDA一加载就看到main函数了,流程也很简单,先是打印信息,再要求输入key,后面有两个检验函数,都通过则打印成功信息。
检验算法整理如下,v0
、v1
分别为输入的第一、第二个双字。:
这也太简单了,可能有问题。先不管,直接z3求解,秒出无解结果。
后来仔细看了下前后两对式子后面的常数,在字母数字组合中基本是无解的,更不用说同时满足两组。
在输入函数里,并未对输入长度作限制,可导致栈溢出。
输入与返回地址之间偏移0x0c字节。key输入12字节后就会覆盖返回地址。询问了组织方,输入不能有不可见或其它特殊字符,而且由于输入格式是%s
,所以输入字符会附加一个字节的\x00
,所以不能直接返回到正确的消息打印流程。
又尝试搜索代码区,希望能找到可以利用的gadget,结果是让人失望的。
现在情况是明显的流程是错误的,题目可能又对出现多解的ROP作了防范。那程序本身肯定有一处是正确流程的开始,而且其地址的低三字节应该都是数字或字母(因为地址0x0040xxxx没有符合条件的,所以返回地址的低三字节全要改写,高字节原是\x00
,覆写为附加的\x00
,保持不变)。
此时,要简单分析下代码区的函数分布。sub_4010e0
到sub_413d42
之间,有大段的00
填充及非正常代码。
sub_4010e0
函数到40112A
结束。后面是5个90
及0x4800个00
填充。接一个'C3 ret',后面一条指令实际上就是sub esp,10
,再后面两条条件跳转jo jno
这是花指令常用的方式了,静态向后看了看,非常大片的花指令,每过一段跳转之后会接一条正常的指令,能看出在取输入。果断停止静态分析。看了下分析过的花指令,感觉ida不太好去除。
直接上OD,输入9876543210ab11A
,在00413131
下断,单步跟踪,跳转直接略过(关键的比较跳转除外),很快就能把关键算法的指令弄出来。
整理成公式就是:
同样z3求解(后来发现直接计算器就能算出来,2333),代码如下:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)