20192204-exp1-逆向与Bof基础 (4)

20192204-exp1-逆向与Bof基础

打开第三个终端按照之前的步骤进行单步调试并查看esp寄存器的值

找到esp寄存器的值,跳转之后找到1234处的地址,计算得出shellcode的地址为ddddd550

回到终端重新进行注入,使用xxd查看shellcode的值:

20192204-exp1-逆向与Bof基础

5 Bof攻击防御技术 5.1. 从防止注入的角度。

在编译时,编译器在每次函数调用前后都加入一定的代码,用来设置和检测堆栈上设置的特定数字,以确认是否有bof攻击发生。

5.2. 注入了也不让运行。

结合CPU的页面管理机制,通过DEP/NX用来将堆栈内存区设置为不可执行。这样即使是注入的shellcode到堆栈上,也执行不了。

通过execstack -s pwn1 来设置堆栈可执行
通过execstack -q pwn1 来查询文件的堆栈是否可执行

20192204-exp1-逆向与Bof基础

5.3. 增加shellcode的构造难度。

结合CPU的页面管理机制,通过DEP/NX用来将堆栈内存区设置为不可执行。这样即使是注入的shellcode到堆栈上,也执行不了。

shellcode中需要猜测返回地址的位置,需要猜测shellcode注入后的内存位置。这些都极度依赖一个事实:应用的代码段、堆栈段每次都被OS放置到固定的内存地址。ALSR,地址随机化就是让OS每次都用不同的地址加载应用。这样通过预先反汇编或调试得到的那些地址就都不正确了。

proc/sys/kernel/randomize_va_space用于控制Linux下 内存地址随机化机制(address space layout randomization),有以下三种情况

0 - 表示关闭进程地址空间随机化。

1 - 表示将mmap的基址,stack和vdso页面随机化。

2 - 表示在1的基础上增加栈(heap)的随机化。

20192204-exp1-逆向与Bof基础

5.4 从管理的角度

加强编码质量。注意边界检测。使用最新的安全的库函数。

6 实验感想 通过本次实验我成功实现了直接通过修改可执行文件中的机器指令,从而达成对程序执行流程的改变,令其由原来的foo函数改为对getshell函数的调用。通过对这个过程的实践,我学会了如何使用odjdump来对一个可执行文件进行反汇编,并且重新熟悉了反汇编结果中的地址、机器指令、汇编指令的结构及其大致用途,在直接修改可执行文件的操作中让我印象比较深的是call指令对应的机器指令是如何实现汇编语言的功能的,e8即为跳转之意,而后面是相对地址的补码,只用eip的值减去后面的相对地址才能得到要跳转的地址,从而完成跳转,在这个过程中我也了解了机器指令是如何实现汇编指令的。

除此之外,我还学会了使用%!xxd命令在vi编辑器中以16进制的形式打开可执行文件,从而完成对可执行文件的修改。

在通过构造输入参数,造成BOF攻击,改变程序执行流的实践中,我再次复习并成功实现了通过缓冲区溢出攻击覆盖程序返回地址从而调用函数getshell,即首先通过反汇编查看可执行文件得到程序预留的缓冲区的长度,然后构造一个过长的输入字符串,输入后通过gdb调试来看到输入字符串的哪些位置覆盖了返回地址,将其替换为getshell函数的地址即可完成对getshell函数的调用。在这一系列操作中我学会了如何在虚拟机系统的命令行中使用gdb进行调试,并且通过指令info r来看到当前操作下每个寄存器的值,这对于我们预先调试可执行文件并作出攻击的操作至关重要。同时在构造字符串时,我还学会了使用perl来将16进制输入串保存到一个文件里再将文件输入到程序中(键盘无法输入16进制字符串,所以需要perl将字符串保存到一个文件中)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjwgg.html