CTF|ropemporium ret2csu题型
题目来源:https://ropemporium.com/challenge/ret2csu.html
这个题只能下载64位文件
IDA查看后发现gets存在栈溢出,题目条件是ret2win的第三个函数必须是“0xdeadcafebabebeef”
ret2win函数里面有system
x86 与 x64 的区别:
x86 都是保存在栈上面的, 而 x64 中的前六个参数依次保存在 RDI, RSI, RDX, RCX, R8 和 R9 中,如果还有更多的参数的话才会保存在栈上
所以按照正常思路我们要找类似“pop|edx”“mov|edx”这样的gadget来个edx寄存器赋值
然后ROPgadget查找后发现没有
对于这种情况 CTFwiki上
题型特点
- 当在x64程序中找不到rdx、rsi、edi时,再使用此方法
- 确定gadget1、gadget2的地址及顺序
## ret2__libc_csu_init原理
在 64 位程序中,函数的前 6 个参数是通过寄存器传递的,但是大多数时候,我们很难找到每一个寄存器对应的gadgets。 这时候,我们可以利用 x64 下的 __libc_csu_init 中的 gadgets。这个函数是用来对 libc 进行初始化操作的,而一般的程序都会调用 libc 函数,所以这个函数一定会存在。我们先来看一下这个函数(当然,不同版本的这个函数有一定的区别)
我们来看看这个函数
在这个函数里面有两个和参数有关的gadget
通过r15 r14 r13 这三个寄存器来控制rdx rsi rdi 的值
在这些寄存器中,我们主要关注的是r12,r