网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.1 ret2text和ret2shellcode
上一篇:网络攻防快速入门笔记pwn|01 Pwn栈溢出基础
下一篇:网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.2 ret2libc
欢迎关注~
一、ret2text
(一)题目中提供了system和/bin/sh
- 基本步骤:
- 检查二进制文件信息
- 打开IDA查看二进制的反汇编代码
- 编写exp脚本
- 开启靶机,进行远程连接
- 利用exp脚本打通远程,获取flag
- 原理
将返回地址覆盖为程序.text段中已有代码的地址,从而执行本身的代码,由于我们要获得shell,二进制文件中本身就含有一个可以直接获取权限的函数,然后我们通过栈溢出漏洞,控制程序执行留,将返回地址覆盖为这个函数的地址让文件运行这个获取权限的函数,我们就可以拿到权限,进而获取flag
- 例题
例题:polarctf靶场——小狗汪汪汪
【解答】
拿到二进制文件,首先检查二进制文件:
No canary,说明可以进行栈溢出
然后用IDA打开二进制文件进行分析
点进init函数中分析,这是一个初始化函数
点进dog函数中分析,有一个gets函数,有可能存在栈溢出:
Shift+F12,查看字符串,发现/bin/sh字符串,顺着字符串发现了getshell函数:
/bin/sh是可以获取系统的shell权限,也就是提权,这个函数是获取系统权限的关键点:
所以这里的思路就是把dog函数的返回地址设置成getshell函数的地址,当我们执行dog函数的时候,就会自动跳到执行getshell函数,从而来获取系统的shell。
先找到getshell地址:
编写脚本:
from pwn import * #从pwn库中导入所有的函数
#io = process('./code/pwn/ret2text/woof') #本地连接二进制文件进行测试
#远程连接
io = remote('1.95.36.136',2060)
getshell_addr = 0x0804859b #getshell函数地址
padding = 4 + 9 #填入的数据长度
payload = b'a'*