pwnable.kr之bof

本文详细介绍了使用GDB和IDA来分析并解决缓冲区溢出漏洞的过程,包括设置断点、计算参数地址、覆盖关键区域等步骤,通过实例演示了小白如何通过实践提升对GDB和IDA的掌握。


bof


两种方法来做吧(就是入门为了练习,多接触一些。。。)

方法1:用ida直接看F5看main函数


跟到func函数中:


算一下

输入的字符串s是ebp-2c

参数1 a1是ebp+8

距离是52,所以要覆盖52个字符。


但是这么简单的程序,抓住机会,小白练习一下gdb

方法2:用GDB调试,算参数地址 gdb bof


单步执行,然后输入字符串,用x/16x看一下ebp+8开始的十六进制,发现已经覆盖成aaaaaa了


看一下从eip开始的20条指令,发现了对比的字符串和函数名字

 

这里是下完断点走到func


在esp中存放的是局部变量,可以看到是0xdeadbeef


看一下func函数,发现有一个gets函数,然后比较,然后比较成功就调用system


最主要的函数这句话,告诉了比较的字符串和去参数的位置,所以只用把ebp+8覆盖为相应的字符串就可以了



说明和这个地址的东西进行比较,如果条件成立则调用system

esp+8 正好是参数1(可以看一下下面的函数栈的示意图就知道了)



ebp+8好计算,就是下面这个值,重要的是如何计算输入的字符串在哪里,进而算出覆盖的距离。







 

一个笨办法:从esp看,从上面的输入完aaaaaaaaaaaaaaaa之后,看esp,因为esp指向的是栈顶,esp下面紧接着就是局部变量,那么我们就可以看到输入的字符串的地址。


确认一下,确实是0xffffd02c


那么输入的东西就是从这个地址开始的

减一下:

输入字符串起始地址是: FFFFD02C

esp+8 = FFFFD060

相差:0X34        52个字符



还是不够,难道是算错了?即需要填充52个字符

Ok…输入这个:


FUCK


我服了。。。。我错了~~~,输入的字符串在内存里表示成十六进制了,而我应该输入十六进制。。。。

知道怎么玩了

 


ps:这里有个知识点。。。。python后面那句话为什么加cat,大神说是最好加上,防止shell一闪而过。可能是为了维持shell吧。还是不太懂,搞清楚了再补充,大神还说应该是

cat -  然而我cat就行了。记住就好。。。。

 

flag:daddy, I just pwned a buFFer :)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值