【PoRE】Lab10: ROP

回到目录

内容总结

  • 划重点前的最后一次课了!这节课主要讲的是一些二进制漏洞,Lab也是设计了一个知名的攻击方法:ROP。之前CS:APP的Attack Lab,实际上已经有涉及到ROP的一些内容了,所以这次反倒是有些“重复”的意思……还是先来看看课程的重点内容。
  • 漏洞(Bug)、脆弱(Vulnerability)、利用(Exploit)的定义及区别。这些课件写得很清楚了。
  • 常见的二进制漏洞:缓冲区溢出、整型溢出、格式化字符串、UAF(Use After Free)等等。
  • 能够了解一些可用的防止漏洞出现的手段,包括但不限于从程序员角度出发的认真仔细、金丝雀值(Stack Canary)、DEP(Data Execution Prevention)、ASLR(Address Space Layout Randomization)等等。
  • 尽管有上述的保护手段,这里列举了一个攻击手段:ROP(Return-oriented Programming),利用程序中的零件(Gadgets),拼装后形成我们想要的攻击代码,借由一些漏洞的利用去实现。这次Lab就是模拟一次ROP攻击。

Lab简介与参考

  • 这个Lab本身的难度并不大,其中涉及pwntools这一工具集的使用,这需要编写一段简单的Python代码。这里只写本次Lab的一些思路。

  C程序代码:
图1: C代码
  这里面有许多的read(),显然这是些可利用的漏洞。
  第一段要攻破的是if (*(long long *)&magic != 0xdeadbeef)这里的条件判断,借由前面对id数组写的溢出8个字符实现。由于在Linux环境下,注意小端法机器的组织格式。(pwntools集成的p64()函数是一种很好的解决方案)
7emsp; 之后的问题是if (strcmp(name, “pore\n”) != 0)这个条件判断,那么最开始好像没什么奇怪的地方,只要往read(0, name, 0x10);这句语句正常地输入pore即可。
  最后是要获取shell权限,随后获取flag了,也就是要执行system("/bin/sh");,显然这句语句并不在C代码里面。
  留意到有现成的system()函数调用:system(“echo Uh oh~”);,这显然是一个可以利用的点,也就是说要想办法执行到这句,然后将参数(即rdi寄存器)改为"/bin/sh"即可,这就是我们要使用最后一句read(0, &buffer, 0x100);要实现的。

解决方案
 (1) 首先留意到buffer数组是一个32大小的数组,且是在栈上分配的,在overflowme()函数结束后会回收32位。那么就先写40个’a’进去,其中后8个’a’覆盖原有语句的pop %rbp。那么从第41位开始的8位,就是我们想要到的返回地址。
 (2) 由于需要执行system("/bin/sh");,这就需要修改%rdi寄存器以修改这个传入的参数,因此一句pop %rdi是必不可少的。找到对应的gadget,它的地址就是41-48位的内容。
 (3) 那么49-56位的内容,就是这个%rdi寄存器应放的内容。由于字符串在C语言的组织形式是char *,从数值来看也是个地址,因此需要找到一个地址,最好我们也能把它改为"/bin/sh",这就要利用另一句read。由于我们发现,name数组是全局的,位置固定。因此在执行到read(0, name, 0x10);这句话时,除了前面的"pore\n\0"(字符串结束,否则不会进入else)之外,后面可以加上我们要的"/bin/sh\0"。(’\0’在Python内需写作’\x00’)组织一下,name处的输入就是pore\n\x00/bin/sh\x00
 (4) 最后,就是要让后面的返回地址指向system(“echo Uh oh~”);这句。由于我们之前的努力,%rdi寄存器已经改为"/bin/sh",这句语句实质上就是system("/bin/sh");。完美收官。
 (5) 最后在pwntools的interactive模式下,运行$ cat flag,就可以打印出flag了。
 (5.1) 据说助教把这个flag文件的模式设为只读,即我们无法修改。这还是我的室友想出的馊主意——得到自己的Flag,让别人无Flag可得。太坏了,但主意听起来还不错(逃)。
 (5.2) 关于pwntools模块和Python代码的编写,这不是件困难的事。如果与我想法一致的话,写起来应该也不慢。

写在最后

  • 关于最后一个Lab的评价,我个人觉得是,想通了,其实确实很简单,助教难得没有骗我们……(哭)看到这里,想必各位也步入期末季了,不知道PoRE这门课大家感觉如何,祝好!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值