逆向工程【缓冲区溢出攻击】
任务描述
掌握函数调用时的栈帧结构,利用输入缓冲区的溢出漏洞,将攻击代码嵌入当前程序的栈帧中,使程序执行我们所期望的过程。
主要方法
溢出的字符将覆盖栈帧上的数据,会覆盖程序调用的返回地址,这赋予了我们控制程序流程的能力。通过构造溢出字符串,程序将“返回”至我们想要的代码上。
实验包括三个可执行文件:
—| bufbomb为目标程序
—| makecookie可以生成bufbomb需要的输入参数的cookie(也可以在gdb调试时直接读取寄存器获得)
—| sendstring可以将ASCII码转成字符(实验用到了拓展ASCII码)
程序运行时栈帧结构
Level0:Somke
getbuf函数在test中被调用,当getbuf返回时继续执行第八行:
void test()
{
int val;
volatile int local = 0xdeadbeef;
entry_check(3); /* Make sure entered this function properly */
val = getbuf();
/* Check for corrupted stack */
if (local != 0xdeadbeef) {
printf("Sabotaged!: the stack has been corrupted\n");
}
else if (val == cookie) {
......
}
}
Bufbomb中一个正常情况下不会被执行的函数:
void smoke()
{
entry_check(0); /* Make sure entered this function properly */
printf("Smoke!: You called smoke()\n");