link:http://reversing.kr
这道题名称叫replace,这么一看根本看不出什么,我们先打开这个pe文件一览
很奇怪,check后居然直接崩掉了
那么,拖进OD看看吧。
通过查找 GetDlgItemTextA函数,我们定位到了这里
这里面有两个函数,前一个为输出correct的,后一个为输出false的
但是,在correct前有两个jmp,后一个没有任何判断就直接就跳过correct的函数了
那么如何才能让他输出正确呢?
我们注意到前面还有一个jmp 00404690的指令,这个跳的的地方比较远,单步调试跟过去看看。
跳到了这么一段东西,单步调试发现
他会把堆中的601969D9(对应输入密码222222)付给寄存器eax
在最后会jmp 00401071,也就是上面长跳的下一行代码
mov dword ptr ds:[0x40466F],0xC39000C6
然后这一段代码执行后,上面一段直接变了
哈,原来是这么replace
看这段代码,他把eax的地址转为0x90,正式NOP空操作指令
这样就能把短跳指令改成NOP了,于是就能输出correct了
然而,这是eax=601969D9,该地址不可访问,难怪会崩溃
但是,这是问题来了,堆中的601969D9是怎么来的呢
简单试了下,通过输入密码来找这个的规律
1 | "0" = 601605cb |
哈,就是对应十六进制加上去呢
所以,我们目标就是
$$
601605CB + password = 00401071
$$
计算器一算得到十六进制A02A0AA6
转换为无符号十进制password = 2687109798
correct,而且也没崩溃了
所以这题的flag = 2687109798