第1关:改写过程返回地址
实验任务概述
本实验中缓冲区溢出攻击的目标是一个名为bufbomb二进制可执行程序,实验的任务是设计、构造合适的攻击字符串(“exploit string”),当输入攻击字符串至目标程序bufbomb后,通过造成缓冲区溢出改变目标程序的行为,达成预定的实验目标。
本实验的目标程序bufbomb在运行时调用如下getbuf过程从标准输入读入一个字符串:
int getbuf()
{
other variables ...;
char buf[BUFFER_SIZE]; // BUFFER_SIZE是预定义的一个正整数常量
Gets(buf);
return 1;
}
其中,过程Gets从标准输入读入一个字符串(以换行‘\n’或文件结束end-of-file字符结尾),并将字符串(以null空字符结尾)存入指定的目标内存位置,即getbuf过程中定义的局部数组变量buf在栈上的具有BUFFER_SIZE个字节的存储空间。需要注意的是,过程Gets并不判断buf数组的大小是否足够容纳全部的输入字符串,而只是简单地向目标地址依次复制输入字符串的所有字符,因此当用户输入给getbuf过程的字符串长度超过(BUFFER_SIZE-1)个字符时,后续字符(以及字符串结尾的null空字符)在栈中的存储位置将超出buf数组的存储空间边界,即发生缓冲区溢出,从而覆盖栈中原来保存的数据。本实验的任务就是设计合适的输入(攻击)字符串覆盖栈中特定数据以达到预定实验目标。
本关卡任务描述
设计合适的攻击字符串,使得输入其至目标程序bufbomb后,在程序中过程getbuf执行return语句后,不是返回到调用过程test继续执行,而是转而执行bufbomb程序中如下一个smoke过程的代码:
void smoke()
{
printf("Smoke!: You called smoke()\n");
validate(0);
exit(0);
}
相关知识
为了完成本关任务,你需要掌握:1.缓冲区及其溢出的概念,2.过程栈帧的结构与组成,3.缓冲区溢出攻击。
缓冲区及其溢出的概念
C语言中当对特定数据结构(例如数组)的写入超出了其所分配的存储区域边界时,即发生缓冲区溢出。由于C语言的特点,C程序易受缓冲区溢出的影响。例如,C语言中对数组中元素进行访问时(通过索引/指针),并不对计算得到的元素的地址做边界检查。
答案如下所示:
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00
d7 93 04 08