思路:
拿到题目,先使用exeinfo查壳
程序是无壳32位
使用ida打开,查看伪代码
大概过一遍
程序将用户输入保存在unk_4033D4
之后有个反调试,然后调用了sub_401042()
函数
接下来是一个判断,判断flag是否正确,但是ida没有识别出来这个函数,应该是被加密了
跟进sub_401042()
函数查看
这个函数对数组byte_403040
进行了操作,这个数组就是判断flag时调用的函数
我们只要动调到sub_401042()
函数执行完就可以看到验证flag的函数
因为程序有反调试,我们在检测反调试的地方下个断点
调试启动!!!
输入flag之后程序停在了跳转这边
jz
是判断zf
标志位来跳转的
我们只要修改zf
标志位就能控制跳转,将zf
改成1,在判断flag的的地方下个断点,继续运行
按f7
于运行一步,双击进入byte_403040
ida已经识别出指令了,在函数头按P
创建函数,再按f5
查看伪代码
现在已经能看到flag的验证函数了
用户输入的数据异或0x11
再加5
等于加密字符串,我们只要将加密flag反正运算一下就能得到flag
接下来写exp
exp:
双击进入unk_403020
,选中shift+e
就能提取加密flag的数据
enc = [
0x7C, 0x82, 0x75, 0x7B, 0x6F, 0x47, 0x61, 0x57, 0x53, 0x25,
0x47, 0x53, 0x25, 0x84, 0x6A, 0x27, 0x68, 0x27, 0x67, 0x6A,
0x7D, 0x84, 0x7B, 0x35, 0x35, 0x48, 0x25, 0x7B, 0x7E, 0x6A,
0x33, 0x71
]
flag = ''
for i in range(32):
flag += chr((enc[i] - 5) ^ 0x11)
print(flag)
flag:
flag{SMC_1S_1nt3r3sting!!R1ght?}