注:本实验所用文件不是csapp官网给出的,是学校下发的。可以参考我的思路。
phase 1
本阶段目标是使getbuf调用结束后,控制权交给touch1函数。
则我们要知道两件事:一是缓冲区大小,二是touch1在虚拟内存中的位置。
用objdump -d ctarget > ctarget.s命令,反汇编ctarget代码。用本机安装的vs打开,方便阅读。
如下图,缓冲区大小为0x38字节,即56字节。
如下图,touch1的位置在0x4018a3.
那么,就可以先输入56字节的任意数据,将getbuf的缓冲区填满,然后溢出8个字节,这8个字节原本的内容是test调用getbuf后的返回地址。将这个返回地址用touch1的地址(0x4018a3)覆盖,这样在getbuf函数执行retq指令后,程序就会返回到touch1函数,执行touch1函数。
新建一个名为e1.txt文件,输入以下内容。
这个e1.txt文件中的内容就是在getbuf中,用户要输入的内容。但是不能直接定向输入到ctarget中,而是要将数据通过hex2raw程序转化后,再输入ctarget程序。
hex2raw的使用方法如下图。
所以,如下图,用hex2raw小工具得到真正的二进制代码,带参数运行。本阶段完成。(个人信息部分已隐藏)