实验目的:
(1)了解缓冲区溢出的原理;
(2)了解程序的栈结构、函数调用以及参数传递的规则;
(3)了解MIPS指令是如何编码的;
(4)加深对debug工具(如GDB)的了解。
实验软件和硬件环境:
Linux 2.6.32-loongson2h
ICT Loongson-2H V0.5 FPU V0.1
实验原理和方法:
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
实验步骤:
(1)溢出分析:getbuf函数中buf只有40个字节长度,但该函数没有对输入的字符串进行判断,存在缓冲区溢出漏洞。
(2)通过执行gdb的bt指令调试观察得,执行完getbuf()后会返回到test()中,由栈的相关知识得,要想通过缓冲区溢出的方式跳转到touch函数就要把touch函数的地址覆盖到getbuf上面的返回地址处。
(3)通过执行disas指令查看getbuf()的反汇编代码得,为了覆盖getbuf函数内的缓冲区以及栈顶及栈顶上的返回地址只要构造48字节长度的字符串就可以将返回地址覆盖,最后四个字节的内容存放touch函数的地址,保证返回地址被touch函数的地址覆盖。
(3)通过p touch打印touch函数的地址:0x400978
(4)因为MIPS架构中字节顺序是小端模式,故在原字符串后追加输入00 00 00 00 78 09 40 00,即完成跳转。