Inf0 - SMC https://dirtycow.cn/tag/SMC/ zh-CN Wed, 25 Oct 2023 17:48:00 +0800 Wed, 25 Oct 2023 17:48:00 +0800 NewStarCTF 2023 SMC https://dirtycow.cn/170.html https://dirtycow.cn/170.html Wed, 25 Oct 2023 17:48:00 +0800 Inf0 思路:

拿到题目,先使用exeinfo查壳

image-20231025165019875.png
image-20231025165019875.png

程序是无壳32位

使用ida打开,查看伪代码

image-20231025165121623.png
image-20231025165121623.png

大概过一遍

程序将用户输入保存在unk_4033D4

之后有个反调试,然后调用了sub_401042()函数

接下来是一个判断,判断flag是否正确,但是ida没有识别出来这个函数,应该是被加密了

跟进sub_401042()函数查看

image-20231025165803500.png
image-20231025165803500.png

这个函数对数组byte_403040进行了操作,这个数组就是判断flag时调用的函数

我们只要动调到sub_401042()函数执行完就可以看到验证flag的函数

因为程序有反调试,我们在检测反调试的地方下个断点

image-20231025172019455.png
image-20231025172019455.png

调试启动!!!

输入flag之后程序停在了跳转这边

image-20231025172126171.png
image-20231025172126171.png

jz是判断zf标志位来跳转的

image-20231025172541644.png
image-20231025172541644.png

我们只要修改zf标志位就能控制跳转,将zf改成1,在判断flag的的地方下个断点,继续运行

image-20231025173030609.png
image-20231025173030609.png

f7于运行一步,双击进入byte_403040

image-20231025173250544.png
image-20231025173250544.png

ida已经识别出指令了,在函数头按P创建函数,再按f5查看伪代码

image-20231025173341591.png
image-20231025173341591.png

现在已经能看到flag的验证函数了

用户输入的数据异或0x11再加5等于加密字符串,我们只要将加密flag反正运算一下就能得到flag

接下来写exp

exp:

双击进入unk_403020,选中shift+e就能提取加密flag的数据

image-20231025174343190.png
image-20231025174343190.png

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?}
]]>
0 https://dirtycow.cn/170.html#comments https://dirtycow.cn/feed/tag/SMC/