0x01:stack3
本篇文章仅为翻译原文是来自https://0xrick.github.io/binary-exploitation/bof1 的缓冲区课程系列。为了模拟真实测试,从这里开始起使用黑盒测试。
先正常无参数运行一次结果发现啥也没弹出来
由于啥回显都没有那么可以随便输入点字符带进去,比如带100个A进去结果提示Segmentation fault(段错误)。如果看到它基本上可以确认发生了缓冲区溢出。同时第一行写着calling function pointer(调用函数指针, 跳转到0x414141)。
总结一下信息,有一个函数指针(function pointer),它根据该函数的给定内存地址执行了一个函数。内存地址放在一个变量中,当我们超过缓冲区容量限制时,可以覆盖这个变量。目前可以看到函数指针正在调用地址0x41414141, 0x41在16进制中是字符’A’。
想要进一步打通关这题需要了解缓冲区发生的位置。因为这里是随机生成n个A,可能是99个就溢出或者是98个就溢出,但还没确切知道缓冲区的容量是多少。其次还需要找到执行函数的内存地址。
0x02:判断缓冲区容量
这里首先需要用scp命令把靶机上的文件传到kali本地上用gdb分析
在运行前需要用到另外一个工具kali的pattern_create和pattern_offset,位置在/usr/share/Metasploit-framework/tools/exploit
pattern_create会用来创造一些字符串的payload可以用来检测溢出位置比如以下语句可以创造出100个字符串payload(后面会用到)而另外一个pattern_offset会帮你确定位置(这个位置可以理解为溢出点位置或者是容量)。
然后gdb 文件名启动
首先需要在main入口设置一个断点,这可以让程序在main函数第一条指令后中断
然后就可run让程序跑起来。
输入c让程序继续跑起来然后输入刚才pattern_create创造出的字符串,此时最后一行提示程序停在0x63413163这里。这里有问题。
那么用回pattern_offset确定下这个0x63413163位置在哪,系统提示是在64这个点。这也意味着缓冲区容量是64,超过这个点就会发生溢出。
0x03:查找函数内存地址
Gdb有条命令info functions可以列出程序所有函数和它的内存地址。Objdump(它可以反汇编目标文件或者可执行文件的命令,一般在LINUX环境下)也可做到这一点。
由于Kali环境下的内存地址可能和Protostar靶机上的文件内存地址稍微有些不同,我们要爬回Protostar上做
命令:objdump -d stack3
往下拉的时候发现一个奇怪的内存地址0x0804824叫win
0x04:解题方法
前面已经判断出缓冲区的容量限制为64,之后我们可以传递函数的地址,函数指针将执行它。而这里的函数地址是指win这个奇怪的函数地址传参过去。这里的x是代表16进制的意思
命令:python -c “print ‘A’ * 64 + ‘x24x84x04x08’” | ./stack3
当然看回源码感觉原作者脑回路有点大
#include
#include
#include
#include
void win()
{
printf("code flow successfully changedn");
}
int main(int argc, char **argv)
{
volatile int (*fp)();
char buffer[64];
fp = 0;
gets(buffer);
if(fp) {
printf("callingfunction pointer, jumping to 0x%08xn", fp);
fp();
}
}
从源代码这样白盒测试的话可以看到函数win()在头部定义,然后定义函数指针的main()分配64个字符串的缓冲区容量。然后把值设为0.之后它接收我们的参数并储存在缓冲区中。最后强调的是if语句。该语句检查功能指针是否从0变更成其它值。然后调用新值的地址。
扫
码
关
注
原文始发于微信公众号(神隐攻防实验室):萌新学习缓冲区溢出漏洞(3.尝试黑盒测试)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论