请你协助他 findkey

findkey

运行程序

运行.png

输入用户名,输入错误程序会直接结束。

IDA

key.png

在这里可以看到一个key

交上去。。

ac.png

过了。。

动态调试

输入.png

设置断点后一直F8直到停止,找到输入的语句。在这里我输入了“123456”。

输入的值.png

在之后的一步 lea eax,[esp+58h+var_18] 为eax取了一个地址,这个地址就是刚刚输入的用户名。

8位.png

之后的语句,是一个判断输入的用户名是否达到8位,用户名必须大于8位。

超过8位.png

输入的用户名超过8位后,下两条语句是取了两个地址,分别是输入的用户名以及McDull@Aun疑似真实用户名,所以下一步可能会将输入的用户名和McDull@Aun进行比较,如果之后出现将两者比较的语句,我们可以把McDull@Aun确定为用户名。

输入用户名.png

用户名.png

输入比较.png

由此得知McDull@Aun是用户名。

重新输入正确用户名后,一直F8到输入密码的语句。

输入密码.png

输入的密码不能超过十一位。

密码不能超过10位.png

之后是将输入的密码与{0x10,0x2A,0x35,0x3A,0x1B,0x3C,0x33,3,0x22,0x23}异或

异或.png

并将异或后的值存入[esp+eax+50h+var_25]

比较.png

再把[esp+eax+50h+var_25]中的值与”I_LOVE_CTF”比较是否相等。

因为a ⊕ b ⊕ b = a. 将{0x10,0x2A,0x35,0x3A,0x1B,0x3C,0x33,3,0x22,0x23}与”I_LOVE_CTF”异或可以得到正确的密码.

密码.png

得到密码 YuyuMyl@ve

然而错了。。因为密码是十一位的。。

正确.png

==在IDA中,将鼠标放在地址上,只能看到这个地址开始后的十个,应该enter去看看全部的数据。==

所以应该将{0x10,0x2A,0x35,0x3A,0x1B,0x3C,0x33,3,0x22,0x23,0x7E}与”I_LOVECTF“异或可以得到正确的密码.

正确密码.png

得到正确密码”YuyuMyl@ve!”

key.png

得到KEY{管理员密码}

这道逆向题,重要的数据都在栈中,要尝试通过地址去看栈中的数据,尽量enter去看完整的数据。