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

被折叠的 条评论
为什么被折叠?



