从零开始的 Pwn 之旅 - Ret2csu
前言
正常程序中是不可能有许多可利用的 gadget的,通常只有一个或几个 gadget 可以利用 ret2csu 是一个常见的 gadget,通常在使用 C++ 的程序中会有这个 gadget
程序解读
我们重点关注 __libc_csu_init 函数
| |
注意这一段
| |
这里等价转化一下就是
| |
与 ctfwiki 中的例子稍有不通但是本质上是等价的 通过这些 gadget,我们可以控制 rbx, rbp, r12, r13, r14, r15 的值
| |
通过 r15, r14 我们可以控制 rdx, rsi 的值 这里只能控制 rdi 的低 32 位, 但是这里高位一般下是为 0 的 如果我们可以合理地控制 r12 与 rbx,那么我们就可以调用我们想要调用的函数。比如说我们可以控制 rbx 为 0,r12 为存储我们想要调用的函数的地址
我们可以控制 rbx 与 rbp 的之间的关系为 rbx+1 = rbp,这样我们就不会执行 loc_4005f0,进而可以继续执行下面的汇编程序。这里我们可以简单的设置 rbx=0,rbp=1。
这里给出 csu 的 payload:
| |
csu_front_addr 地址为
csu_end_addr 地址为
为什么要使用这种形式的 payload?
ctfwiki ctfwiki 中下半部分使用 pop 进行控制
| |
但是我们可能遇到 mov 进行控制(本题), ctfwiki 中 csu_end_addr 指向的是 pop rbx, 但是 mov 形式的 add rsp, 8 这部分被合并后面的部分,导致我们没法跳过
实战要灵活变通
攻克题目
栈溢出 + 格式化字符串
64 位,无 cancary
查找 gadget
| |
很少没法传参, 使用 csu
payload:
| |