拿到题目,先使用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
双击进入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{SMC_1S_1nt3r3sting!!R1ght?}]]>