Buffer overflow lab address: https://courses.cs.washington.edu/courses/cse351/17sp/lab-3.html
你需要知道 gdb 当中的各个指令是如何使用的, x86 的体系当中, 几个常用的指令以及常用的寄存器, 如果你不熟悉, 可以参考下面的 repo 以及配套实验, 在做中学.
https://github.com/NagleZhang/Binary-Bomb.git
完成这套实验, 你将熟悉栈的基本工作方式, 以及了解栈的方式会如何在攻击中被加以利用.
- 源代码: https://github.com/NagleZhang/buffer-overflow
- git
- gdb
- objdump
- linux
我们要做什么?
- 阅读 bufbomb.c, 理解调用逻辑。
- 将 bufbomb 反汇编。了解在堆栈中程序的状态。
- hack 正在运行的程序, 通过堆栈溢出的方式,做一些原程序意愿的事情.
答案分别在各自 level 的文件夹当中. 细则如下:
-
bytes , 二进制转换成 ascii 的结果, 也是被 bufbomb 直接消费的内容.
-
text, 答案本身. 需要通过 sendstring 转换成 ascii, 才能够被 bufbomb 消费.
-
core.S, 各个关卡中 bufbomb 所使用的函数汇编码.
-
其他关卡本身需要的东西不一一列举.
第零关的二进制程序叫做 bufbomb 我们可以阅读 bufbomb.c 这个程序,会发现里面有几个函数。test() / smoke() / getbuf().
test 会调用 getbuf。然后进行返回。 我们的目的是, 在getbuf 完成后,不返回test,而是直接跳转到 smoke()
这一关卡和第二关本身无太大区别, 多了几个参数, 所以解决方案也一致. 无非是在 stack 当把参数也进行覆盖操作.
这一关卡, 试验者将试图把汇编代码放入到栈当中, 再通过第 0/1 关学习到的覆盖 rip 的内容的手段, 把返回地址覆盖为栈地址.
从而执行自定义的汇编代码(修改 global_value), 并且再次返回到 bang() 函数. 通过其对比逻辑.
比较有用的命令: x \20i $address
可以用来验证自己写入到栈当中的代码是否正确.
该试验其实是可以快速通过, 因为 gdb 当中有一个 command 叫做 set, 可以通过 set 命令来对 global_value 进行修改, 直接省去写汇编的过程. 不过, 也就失去了学习在栈上执行代码的乐趣.(打破规则的乐趣?)
文件名称 | 描述 |
---|---|
makecookie | Generates a "cookie" based on some string (which will be your username) 基于字符串生成一个 “cookie” (用你的姓名) |
bufbomb | 你需要进行攻击的二进制文件 |
bufbomb.c | 二进制文件的源码 |
sendstring | 将 hex 转换成 ascii |
Makefile | 测试是否通过 |
sendstring 的作用是将地址转换成string类型。 为什么要有这个东西的存在呢? 是因为我们程序在跳转的过程当中, 寄存器会存储各种地址,而我们如果将目的地址解析成各种字符串,然后再去写答案会非常的不方便,所以这个工具也就应运而生。
打个比方说,我们的一个地址是 0x41414141, 如果我们在写答案的时候,需要将其转换成 string 类型,那么我们必须要把地址拆成 41 41 41 41,然后我们去找到 ascii 码表,一个一个的对应,这样我们会花去很多的时间。 而使用 sendstring ,我们就很方便了,直接在答案里面填写41 41 41 41(比如说写到 result.txt的文件当中),然后再使用命令
cat result.txt | sendstring
这样我们就会得到AAAA
,这一串字符了。