BUPT CS:APP lab 3 缓冲区溢出攻击实验

tar -xvf target.tar指令解压接收到的文件,用objdump -d target/ctarget > ctarget.txt指令和objdump -d target/rtarget > rtarget.txt指令生成反汇编代码文件,然后开始分析。

 Phase_1

       阅读实验讲义可知,本关要使得getbuf()函数返回的时候,执行touch1()而不是返回test()。因此我们先确定getbuf创建的缓冲区的大小,查看代码可知,缓冲区大小为0x38(即56)。因此我们只需要构造攻击字符串将这56个字节填满,然后再填入touch1的起始地址(注意是小端法),即可完成攻击。构造字符串时,需要用到hex2raw来生成攻击字节码,然后将生成的攻击文件输入到ctarget中。

Phase_2

观察实验讲义中的touch2函数可知,需要将cookie作为参数传进去,然后将touch2压栈,所以我们可以写出对应的汇编代码(其中第一个立即数是cookie,第二个立即数是touch2的地址),然后转换成对应的机器码。

然后需要找出缓冲区的地址,运行gdb,设置断点到getbuf,然后查看%rsp的值,即可得到相应地址。

然后可以构造出攻击字符串,再转换成攻击字节码,输入,通过。

Phase_3

查看实验讲义可知,本关需要将cookie转换为字符串传递到touch3,转换0x3177de01可得33 31 37 37 64 65 30 31(不想翻ASCII表的,友情提供网站:https://www.sojson.com/ascii.html)。因为在touch3内部又调用了hexmatch和strncmp函数,所以可能会覆盖一部分缓冲区;但getbuf之上的堆栈是安全的,所以我们可以将cookie存放在getbuf之上的堆栈中,即 %rsp+0x38(缓冲区大小)+0x8(返回地址大小)=0x5561e178+0x38+0x8=0x5561e1b8就是cookie应该放置的位置。之后通过和Phase_2一样的方法得到攻击字节码。输入,通过。

Phase_4

本阶段需要使用ROP攻击的方法完成Phase_2,所以作为参数,可以把cookie赋给%rdi,再指向touch2;因此思路是用popq %rax和movq %rax,%rdi指令,将cookie作为参数传入。查找实验讲义中的编码指令表可知其分别对应 58 和 48 89 c7 这两个指令;在代码中 start_farm 到 mid_farm 之间查找,得到对应的地址分别为 0x4019c5+0x1=4019c6 和 0x4019cb+0x2=4019cd;然后构造攻击字符串,具体原理是先用任意字符填充整个缓冲区,再依次传入popq指令地址、cookie地址、movq指令地址、touch2地址;最后同上,输入,通过。

Phase_5

本关的要求是用ROP的方法完成Phase_3,原理同上;先将 start_farm 到 end_farm之间的代码翻译成可用的指令(工作量巨大)。

然后从这些可用的指令中,凑出完成phase_3的汇编指令及其对应的地址,其中,代码原理是:先将栈顶指针赋给%rdi,然后将偏移量赋给%rsi,最后两个加和得到cookie的地址,如下:

其中偏移量是字符串地址和返回地址之间的距离,为8*9条指令=72=0x48;

然后构造攻击字符串,原理:先用任意字符填充整个缓冲区,再依次输入上述地址,最后是touch3的地址和cookie的地址,然后转换,输入,通过。

 

Good Luck! : - )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值