网站大量收购闲置独家精品文档,联系QQ:2885784924

计算机系统基础lab4代码注入攻击.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

实验4:代码注入攻击

Attack

实验目的

?进一步理解软件脆弱性和代码注入攻击。

实验内容

实验内容包括以下三个任务:详细内容请参考实验指导书:实验4.pdf

No.

任务内容

1

任务一:在这次任务中,你不需要注入任何代码,只需要利用缓冲区溢出漏洞,实现程序控制流的重定向。

2

任务二:在这次任务中,你需要注入少量代码,利用缓冲区溢出漏洞,实现程序控制流的重定向至touch2函数,并进入touch2函数的validate分支。

3

任务三:在这次任务中,你需要注入少量代码,利用缓冲区溢出漏洞,实现程序控制流的重定向至touch3函数,并进入touch3函数的validate分支。

实验要求

在Unbuntu18.04LTS操作系统下,按照实验指导说明书,使用gdb和objdump和代码注入辅助工具,以反向工程方式完成代码攻击实验。

任务一和任务二是必做任务;任务三为选做,有加分。

2)需提交:电子版实验报告全文。

实验结果

首先使用objdump-dctargetctarget.s命令得到ctarget程序的汇编程序。

任务一

unsignedgetbuf()

{

charbuf[BUFFER_SIZE];

Gets(buf);

return1;

}

图1任务一正常输入与超缓存输入

图2getbuf()汇编代码

根据提示得知,getbuf()存在缓冲区溢出,在ctarget.s中全文搜索getbuf找到相关汇编程序,由

4017a8: 4883ec28 sub$0x28,%rsp

发现栈指针只预留了40个字节的空间,所以只要输入超过40个字节便发生缓存区溢出。

代码中函数执行地址均为3字节,可知(%rsp–0x27,%rsp–0x29)处储存getbuf()函数返回地址,则输入的前40个字节可以被正常保存在buf[40]中,所以我们需要通过第41、42、43字节破坏函数返回地址。

图3touch1()汇编代码

voidtouch1()

{

vlevel=1;/*Partofvalidationprotocol*/

printf(Touch1!:Youcalledtouch1()\n);

validate(1);

exit(0);}

通过查看touch1开始地址为0x4017c0,确定要将getbuf()返回地址改为该地址,又因为小段序存储,高地址存储高字节,所以读入顺序应为为c0、17、40,即在任意40个不为0xa的字节后在加入c01740即可完成要求。

图4任务一完成

hex_1.txt中输入01020304050607080917111213141516171819202122232425262728293031323334353637383901c01740。

通过./hex2rawhex_1.txt|./ctarget-q运行通过

任务二

首先同任务一,将touch2起始地址传入栈溢出部分进行跳转

图5touch2()汇编代码

将ec1740按序输入40个字节后,便实现返回0x4017ec

图6进入touch2()

进入后,我们查看touch2()函数运行逻辑

voidtouch2(unsignedval)

{

vlevel=2;/*Partofvalidationprotocol*/

if(val==cookie){

printf(Touch2!:Youcalledtouch2(0x%.8x)\n,val);

validate(2);

}else{

printf(Misfire:Youcalledtouch2(0x%.8x)\n,val);

fail(2);

}

exit(0);

}

需要使val==cookie(0x59b997fa)从而进入validate(2),下面通过代码注入实现,将代码存入栈指针存放的地址处,再使getbuf()返回到%rsp处,从而执行注入的代码。

使用gdb工具inforegisters发现在(b*0x4017b4)

4017b4: b801000000 mov$0x1,%eax处时

rsp存放地址为0x5561dc78

图7任务二代码注入

将touch2()开始地址压入栈顶

将0x59b997fa赋值给%rd

文档评论(0)

知识贩卖机 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档