20145311《网络对抗技术》逆向及BOF进阶实践
学习目的
- shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode 的地址。
- Return-to-libc 攻击实验:即使栈有不可执行的能力,无法将shellcode放入堆栈中运行,但我们却可以直接让漏洞程序调转到现存的代码来实现我们的攻击。(本次实验所用的是已经载入内存的 libc 库中的 system()函数等)
基础知识
- ps 命令:用于查看进程号,结合参数管道
- (gdb) disassemble foo: 反汇编一段内存地址
- (gdb) x/16x : 使用x命令(examine的简写)来查看内存地址中的值。
- x命令的语法:x/<n/f/u>
实践过程
shellcode的注入
最开始需要设置堆栈可执行,并查询堆栈是否可执行,以便shellcode在堆栈上可以执行
关闭地址随机化,避免每次执行分配的内存地址不同
采取anything
+
retaddr
++nop
shellcode来构造payload
找到进程号进行gbb调试
先不要回车,等待后面的调试
在ret处设置断点,接着运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,并由此分析出返回地址位置的正确性以及shellcode的地址
将作为输入的 input_shellcode 处的 “\x1\x2\x3\x4” 换为上面所找到的 shellcode 地址 “\x30\xd3\xff\xff”
修改完之后在运行,程序的返回地址就已经被修改成了shellcode的地址,从而执行shellcode获得主机的权限
Return-to-libc 攻击实验
进入linux32的环境,将地址随机化关闭,同时使用ln
命令,让 /bin/sh 指向另一个shell程序(这里是zsh)(因为原 /bin/bash 有保护措施,即使能调用一个shell,也不能在这个shell中保持root权限)
编写retlib文件并进行编译
编写读取环境变量的程序并进行编译
编写攻击代码
读取环境变量
调试攻击程序得到system与exit的地址
将攻击程序中的buf换为获得的3个地址
重新编译攻击程序会生成badfile文件,再次运行漏洞程序retlib,可见攻击成功
再次执行便能够成功获取到主机的shell
实验体会
这次实验主要是在开启了堆栈可执行、关闭了地址随机化的条件下去完成的,可见在实际环境中进行攻击时会遇到更多更麻烦的情况在注入shellcode的时候还是遇到一些困难,尤其是如何构造payload,一开始采用的构造方式怎么尝试也没能成功,后来改成了anything+retaddr+nops+shellcode之后顺利成功了,说明自己在理解堆栈这一块还是有点问题,关于bof攻击如何正确将自己的攻击代码覆盖到缓冲区从而执行是非常关键的