首页
社区
课程
招聘
[原创]CTF2017 第二题 ctf2017_Fpc writeup
2017-10-27 12:47 2616

[原创]CTF2017 第二题 ctf2017_Fpc writeup

2017-10-27 12:47
2616
个人感觉这题需要一点猜迷成分……先说错误解好了
直接开IDA f5


所以目测是需要过两个check,check1, check2. get_input 会把输入存到栈上,这里有个scanf的溢出之后正确解会用到


check1

直接z3就可解出解 v1 = 0x6f503a42, v2 = 0xcf503a42,但因为是二元一次方程,所以只有一个唯一解

check2

同理,z3可解得 v1 = 0xb3a94883, v2 = 0x73a94883,同上,也是唯一解

这下问题就来了……由于我们输入只有一次,所以check1和check2必须同时过才行,但是check1和check2的解不一样,所以我们无法达成两个都满足的条件,加上两组解都不是完全在可打印字符串内,说明这两个函数是坑,此题有别的解法……

下面说正确解,回到IDA的hex view,往下滚,发现有很大一部分的.text 没有用到,这就让人感觉很奇怪,跳到第一个没有用到的并且不是0的命令c一下,发现是ret,紧跟着是add esp,0xfffffff0h

之后的两个指令很有意思,不管OF是什么状态我们一定会跟着其中一个走,手动双击几回,我们会发现
jo这个分叉会走 0x413160->0x41314d->0x413165->0x413146->0x413150 (途中会有多个jo指令)
jno这个分叉会走 0x413158->0x413141->0x413149->0x41313c->0x41315a->0x413150 (途中会有多个jno指令)
途中可能会遇到花指令,只要U掉那个指令然后在正确的地方重新C就好了

这样我们可以看出不管我们走哪条路线,最后都会走到0x413150, 而0x413150恰好是个非跳转指令,我们手动的把他标为instr1, 然后可看出上述的情况又会出现,jz和jnz

同上,最后他们也会殊途同归,所以我们不难看出这其实是个用各种分支来混淆代码的方法……,这样一来我们只要跟着其中一个分支走,然后标记不为这种肯定会选择一个分支跳转的指令就好了,分别标记为instr0, instr1, instr2...,

人肉标完以后我们就可以单把这些指令拎出来看了,上idapython
for i in range(41):
	ea = LocByName("instr%d" % i)
	print idc.GetDisasm(ea) 

得到以下代码
add     esp, 0FFFFFFF0h
xor     eax, eax
mov     counter, eax
pop     eax
mov     ecx, eax
pop     eax
mov     ebx, eax
pop     eax
mov     edx, eax
mov     eax, ecx
sub     eax, ebx
shl     eax, 2
add     eax, ecx
add     eax, edx
sub     eax, 0EAF917E2h
jnz     wrong
add     eax, ecx
sub     eax, ebx
mov     ebx, eax
shl     eax, 1
add     eax, ebx
add     eax, ecx
mov     ecx, eax
add     eax, edx
sub     eax, 0E8F508C8h
jnz     wrong
mov     eax, ecx
sub     eax, edx
sub     eax, 0C0A3C68h
jnz     wrong
pop     eax
xor     eax, 8101h
mov     edi, eax
xor     eax, eax
...
这跟我们之前看见的check1和check2的格式很像,其中栈被pop了三次,分别对应我们输入的[8:12], [4:8], [0:4] 所对应得值,我们可以直接用z3解得我们需要的输入为

Just0for0fun


因为scanf会造成栈溢出,所以我们可以覆盖被储存的栈指针的最后3个字节,将EIP改到我们add esp,0xfffffff0h,既0x413131, 小端转成字符串以后既为 "11A"

所以最终答案为  Just0for0fun11A

附:所用z3 python 脚本



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

上传的附件:
  • 2.py (0.72kb,26次下载)
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回