(本试验来自卡耐基梅隆大学:《深入理解计算机系统》,第三章,家庭作业3.38, 攻击目标源代码来自其网站:
代码下载
)
该试验要求是:给定一个具有缓冲区漏洞的程序,要求学生利用缓冲区溢出原理,通过输入未经检查长度的字符串,使程序按照攻击者的意愿执行。(书中要求返回0xdeadbeef。)这个试验设计的非常恰到好处,包括了:使用gcc,gdb和反汇编器,编写二进制攻击代码(shellcode)的基本原理,分析汇编代码等等基础知识。虽然本试验不能形成一个真正意义上的”有破坏”或者能提高权限的攻击,但是却已经包括了缓冲区溢出攻击的方方面面。
从CSP:APP网站上下载该代码:bufbomb.c ,我们发现下面2个我们感兴趣的函数:
/* $begin getbuf-c */
int getbuf()
{
char buf[12];
getxs(buf);
return 1;
}
void test()
{
int val;
printf("Type Hex string:");
val = getbuf();
printf("getbuf returned 0x%x/n", val);
}
bufbomb.c
Test 函数仅仅负责调用getbuf()函数,获得返回值后打印出来。我们要做的就是改变程序的执行流,插入我们想要执行的指令,并悄无声息的返回到前端调用中。首先,观察到getbuf()函数无论如何都返回1,我们知道C中处理返回值是把整数或者指针等值放在 eax 中。所以,getbuf代码中必然有 movl $0x1,