美文网首页
(pwn)基本ROP的几个例子(一)

(pwn)基本ROP的几个例子(一)

作者: 鸡龙 | 来源:发表于2018-11-13 17:41 被阅读0次

    对Wiki上的几个例子复现

        一、stack_example

            点击下载文件stack_example.c

    无success入口的情况下,尝试进入success()

    对c文件进行编译

    提示gets函数为危险函数,可以导致栈溢出

    用checksec工具查编译出文件的保护程度

    在这之前已把ASLR和PIE关闭

    经过IDA的反编译查看刚刚有调用危险函数gets的函数vulnerable的伪代码

    该字符对ebp距离为14的十六进制0x14

    对栈结构进行分析。

    接下来只要想办法将success函数的地址覆盖掉retaddr

    只要将读取字符串栈溢出越界,saved ebp中为4个字符量大小

    想要到达retaddr就是读取 0x14+4的字符量

    在IDA查询success函数的起始地址是0x08048456 如图

    因为在我们的调试环境中,“内存数据”中的 DWORD 和我们逻辑上使用的

    “数值数据”是按字节序逆序过的。

    所以地址应该要按两个一组化成十六进制逆序排放

    \x56\x84\x04\x08

    这些字符可能无法用键盘完全输入

    需要利用pwntools工具与程序交互

    并在虚拟机里面执行一波

    成功的将success函数里面的puts运行显示

    二、ret2text

    点击下载文件ret2text

    获得文件ret2text,先检查保护

    无canary无PIE

    IDA伪代码

    发现危险函数gets

    检查其他函数发现

    又发现secure中有调用system("/bin//sh")

    断点,查看esp,ebp

    由之前学习知道,存放ebp上方为返回地址,只需要将返回地址覆盖为调用system的地址即能进入我们/bin/sh

    esp 0xffffcfa0 esp中s相对esp为1CH,s地址为0xffffcfbc

    ebp 如显示为0xffffd028

    计算s相对ebp偏移d028-cfbc=6c

    对ebp偏移为6c,所以对返回地址偏移6c+4

    payload

    三、ret2shellcode

    点击下载文件ret2shellcode

    检测保护

    基本无保护NOPIE NO canary found并且NX disabled

    IDA打开

    伪代码

    发现gets,不同的是,这次将s复制给了buf2

    进入buf2

    发现为.bss段

    gdb调用一下文件

    运行所处位置为

    (通过百度和问师兄,大概为设立随机暂存区域)

    进行内存分析vmmap

    该.bss段具有可执行权限

    偏移量计算

    esp 初始Oxffffcf80

    ebp 0xffffd008

    d008-vf80=0x88

    计算setvbuf()相对ebp偏移

    0x88-1ch=6c

    所以相对反对地址的偏移为0x6c+4

    十进制为112

    具有可执行权限的.bss段地址 0x0804A080

    payload

    总结

            栈溢出重要步骤:

                1.找出危险函数

                2.利用危险函数覆盖函数返回地址或bss段某个变量

    参考

        vmmap内存详解

        5个数据段

        gdb-peda调试总汇

        setvbuf全缓冲/行缓冲/不带缓冲

        pwntools使用

    该文的例子都来自CTF Wiki

    相关文章

      网友评论

          本文标题:(pwn)基本ROP的几个例子(一)

          本文链接:https://www.haomeiwen.com/subject/ddblfqtx.html