Problem: [HNCTF 2022 Week1]ezcmp
思路
- 解题大致思路
看看程序的保护机制,别忘了给刚下载下来的附件加权,刚下来的程序不具有可执行权限

看看 main函数的逻辑

strcpy(A,B)函数会将 B 复制给 A
即 将字符串"Ayaka_nbbbbbbbbbbbbbbbbb_pluss"给buff,然后将它用 enccrypt()函数加密,并将 加密结果与我们的输入比较
strncmp 函数详解
int strncmp(const char *str1, const char *str2, size_t n);
功能:比较 str1 和 str2 的前 n 个字符。
返回值:
< 0:str1 的前 n 个字符 小于 str2(按字典序)。
= 0:str1 的前 n 个字符 等于 str2。
> 0:str1 的前 n 个字符 大于 str2。
结果相同就返回 0,就不会执行 if语句 中的exit(0)(退出程序),就可以正常执行system("/bin/sh")
由于 字符串"Ayaka_nbbbbbbbbbbbbbbbbb_pluss"在程序中为定值,加密函数也不变,加密结果也是一个定值,我们可以用 gdb动态调试,查看生成的加密结果,然后再重新运行程序,输入加密结果,通过strncmp()比较

gdb ezcmp
b main设置断点在 main函数
r重新运行程序
n单步调试,一直到 strncmp()
中间的 read()函数随便输点什么

可以看到 buff的地址为 0x404100
输入x/10gx 0x404100可以查看0x404100即往下数的 ,10个地址的数据

这几个用红框框圈起来的值,就是最终的加密结果
EXP
- 具体攻击代码
from pwn import *
context(os="linux", arch="amd64", log_level="debug")
#io = process("./ezcmp")
io = remote("node5.anna.nssctf.cn", 25095)
io.recvuntil(b"useful\n")
payload = p64(0x144678aadc0e4072) + p64(0x84b6e81a4c7eb0e2) + p64(0xf426588abcee2052) + p64(0x0000c8cb2c5e90c2)
# 注意小端序的数据输入形式
io.sendline(payload)
io.interactive()

总结
- 对该题的考点总结
