对Wiki上的几个例子复现

    一、stack_example

        点击下载文件stack_example.c


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

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

对c文件进行编译


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

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

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


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

在这之前已把ASLR和PIE关闭

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


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


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

对栈结构进行分析。


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

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

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

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

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


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

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

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

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

\x56\x84\x04\x08

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

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


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

并在虚拟机里面执行一波


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

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


二、ret2text

点击下载文件ret2text

获得文件ret2text,先检查保护


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

无canary无PIE

IDA伪代码


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

发现危险函数gets

检查其他函数发现


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


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

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


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

断点,查看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


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


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

三、ret2shellcode

点击下载文件ret2shellcode

检测保护


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

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

IDA打开

伪代码


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

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

进入buf2

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

发现为.bss段

gdb调用一下文件


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


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

运行所处位置为


(pwn)基本ROP的几个例子(一)
(通过百度和问师兄,大概为设立随机暂存区域)

进行内存分析vmmap


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

该.bss段具有可执行权限

偏移量计算

esp 初始Oxffffcf80

ebp 0xffffd008

d008-vf80=0x88

计算setvbuf()相对ebp偏移

0x88-1ch=6c

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

十进制为112


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

payload


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

总结

        栈溢出重要步骤:

            1.找出危险函数

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

参考

    vmmap内存详解

    5个数据段

    gdb-peda调试总汇

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

    pwntools使用

该文的例子都来自CTF Wiki

相关文章: