这个实验在第三章学完后就可以做了,内容主要就是3.10.3和3.10.4的部分,主要目标是熟悉两种攻击程序的方式:代码注入(Code Injection,CI)和面向返回编程(Return Oriented Programming,ROP)
Let’s Hack!
实验说明
首先还是提醒一下,每个人的程序可能是不一样的,所以答案只是参考,但方法是通用的
-
目标程序:
ctarget和rtarget,分别是在CI阶段和ROP阶段存在漏洞的程序。使用-q选项来避免将分数发到服务器,否则会出现illegal host错误。使用-i选项来读取文件作为输入(很重要),因为我们的攻击都是用二进制文件进行攻击 -
实验原理:在两个目标程序的源代码中,
test程序都调用了getbuf函数,这个函数读取我们的输入并保存在栈上,而这个函数的栈帧只开辟了有限的空间,因此存在返回地址被覆盖的漏洞。我们通过输入一定的exploit string就可以让函数返回后不回到test,而是到我们为它安排的地址。如果不是很明白的话可以参考书上的练习题3.46,很有帮助,我自己的理解大概是这样的:

-
hex2raw:这个工具可以将写好的16进制的
exploit string转换成能传给目标程序的文件,我们编写的exploit string应该像真实的内存一样,每个字节之间用空格隔开并使用小端序,举例,假设调用getbuf时栈指针rsp的地址为0x12345678:00 00 00 00 00 00 00 00 /* 0x12345678 */ 00 00 00 00 00 00 00 00 /* 0x12345680 */ ef cd ab 89 00 00 00 00 /* 0x12345688 */上面的
exploit string会在0x12345688处写入0x89abcdef,如果我们的返回地址正好是0x12345688那么代码就会运行到我们注入的这个地址。hex2raw支持C风格的注释,所以可以使用/**/让你的答案更有可读性,但注意要用空格全部隔开,更多细节可以参考pdf中的附录A
CI
这种攻击方式主要是通过改写栈空间的数据,让程序执行我们希望它执行的代码。我们可以先自己编写汇编指令,将它进行汇编后再进行反汇编,就可以得到指令的字节表示形式了,具体可以参考附录B
Level1
第一阶段的目标是调用touch1,我们只需要找到touch1的地址,把它注入到getbuf的返回地址处即可,不需要额外的代码
首先可以用objdump -d ctarget > dis.s获得ctarget的汇编代码并保存在dis.s中,然后找到touch1的地址

因此我们直接注入c0 17 40即可,注意是小端序。然后我们查看一下getbuf的汇编代码:

可以看到栈指针减少了0x28也就是40,所以我们在40个字节之后注入地址即可,最终的exploit.txt如下:

用如下的命令将它转换成可以传给ctarget的文件:
./hex2raw < exploit.txt > exploit-raw.txt
然后用ctarget读入
./ctarget -q -i exploit-raw.txt
这两步也可以合成一步
cat exploit.txt | ./hex2raw | ./ctarget -q
效果如下:


这篇博客详细记录了《深入理解计算机系统》中的AttackLab实验,涵盖CI(代码注入)和ROP(面向返回编程)攻击。作者通过Level1到Level3的逐步解析,讲解了如何利用漏洞执行自定义代码,包括寻找函数地址、构造注入数据和理解栈帧变化。实验旨在深化对栈溢出和代码执行机制的理解。
最低0.47元/天 解锁文章
4万+

被折叠的 条评论
为什么被折叠?



