看雪 FPC--reverse

很长时间没有在这里记录Writeup了,这次这道题目实在太让我兴奋了。有感而记。

拖进IDA;

惊奇的发现,除了scanf之外,只需要两个函数就执行到了"Bad.....";

依次查看两个验证函数;

1.sub_401080

 会发现  a1与v2是恒等的,if 不会成立,也就是永远不会“YouGetIt”

2.sub_4010D0

同样的道理,这里也永远不会"Yougetit"

困惑:这就很不正常了,就是说程序的正常执行流程下,永远不会pass;

暗示,可能需要特殊的输入,改变程序的执行流程(栈溢出)

拖进OD,在scanf入flag后通过观察栈,得知,12个字符恰好覆盖返回地址以上部分。


那么,要把程序带到什么地方呢(用哪个地址来覆盖原来的返回地址);
由于输入的全部是可打印字符,可以在IDA中手动查看可疑的地址字段。发现00413131,是一段很像花指令的东西。

尝试一下,输入‘aaaabbbbcccc11A’;
惊奇的发现,程序执行了验证算法,(证实了思路)

由于花指令的存在,我选择了动态调试
在OD中开启RUN TRACE,单步跟入调试(F8或者f7跟踪,遇到跳转,jz,jl   可以改变z标志位改变流程,继续跟踪)

最后查看执行过的指令。


拷贝下来,过滤得到有效的指令

分析汇编代码:

add esp,-0x10
xor eax,eax
mov dword ptr ds:[0x41B034],eax
pop eax
mov ecx,eax
pop eax
repne jae short 00413266
mov ebx,eax
pop eax
mov edx,eax
mov edx,eax
mov eax,ecx
sub eax,ebx
shl eax,0x2
add eax,ecx
add eax,edx
sub eax,0xEAF917E2

对应的方程:

(x-y0<<2 + x + z == 0xEAF917E2

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,0xE8F508C8

对应的方程:

(x-y) << 1 + (x-y) + x + z ==0XE8F508C8

mov eax,ecx
mov eax,ecx
sub eax,edx
sub eax,0xC0A3C68

对应的方程:

(x-y) << 1 + (x-y) + x  - z == 0xC0A3C68

其实就是解三元方程组
用Z3求解器,或者在线求解
得到x,y,z,在加上'11A'就是flag

Just0For0Fun11A

猜你喜欢

转载自blog.csdn.net/caobo_lq666/article/details/82943069
今日推荐