Inf0 - SMC
https://dirtycow.cn/tag/SMC/
-
NewStarCTF 2023 SMC
https://dirtycow.cn/170.html
2023-10-25T17:48:00+08:00
思路:拿到题目,先使用exeinfo查壳image-20231025165019875.png程序是无壳32位使用ida打开,查看伪代码image-20231025165121623.png大概过一遍程序将用户输入保存在unk_4033D4之后有个反调试,然后调用了sub_401042()函数接下来是一个判断,判断flag是否正确,但是ida没有识别出来这个函数,应该是被加密了跟进sub_401042()函数查看image-20231025165803500.png这个函数对数组byte_403040进行了操作,这个数组就是判断flag时调用的函数我们只要动调到sub_401042()函数执行完就可以看到验证flag的函数因为程序有反调试,我们在检测反调试的地方下个断点image-20231025172019455.png调试启动!!!输入flag之后程序停在了跳转这边image-20231025172126171.pngjz是判断zf标志位来跳转的image-20231025172541644.png我们只要修改zf标志位就能控制跳转,将zf改成1,在判断flag的的地方下个断点,继续运行image-20231025173030609.png按f7于运行一步,双击进入byte_403040image-20231025173250544.pngida已经识别出指令了,在函数头按P创建函数,再按f5查看伪代码image-20231025173341591.png现在已经能看到flag的验证函数了用户输入的数据异或0x11再加5等于加密字符串,我们只要将加密flag反正运算一下就能得到flag接下来写expexp:双击进入unk_403020,选中shift+e就能提取加密flag的数据image-20231025174343190.pngenc = [
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?}