Linux C/C++开发常见错误及其漏洞(二)

上篇介绍了一些常见的便错错误导致的漏洞,下面捎带讲解下相关的漏洞利用。

由于有部分内容可能需要实际操作,所以可能无法介绍清晰,还请见谅!

一、基础汇编

介绍之前首先带大家了解下基础的汇编语法以及基础知识。

对于64位系统,系统地址空间变大同时增加了多个通用寄存器
被扩展到64位的通用寄存器为:RAX,RBX,RCX,RDX,RSI和RDI
被扩展为64位的指令指针,基地址指针,栈指针分别为RIP,RBP和RSP
提供的额外寄存器:R8到R15
8字节宽的指针
在栈上push/pop为8字节宽
地址最大的标准大小为0x00007FFFFFFFFFFF
通过寄存器传递函数的参数

这些变化以及加强的保护措施(栈区不可执行、地址随机化)可以缓解由于代码漏洞带来的威胁,但远远不够。

这是一个汇编之后的函数。

上图则是函数的调用堆栈。

对于我们利用主要集中在参数以及RET地址,call命令做了两件事情,一是将EIP寄存器内的值压入栈中,称为返回地址,函数完成后还要到这个地址继续执行程序,然后将被调用函数第一条指令地址存入EIP中,由此进入被调函数。

利用一段内存溢出,我们只需要从溢出位置向下找到函数返回地址并将其修改成我们希望的地址即可达到目的。

第一种:找出返回地址修改成程序内的其他函数地址从而跳过某些检查达到一定的目的。这中方式无需有溢出存在,参考某些软件的破解版。

第二种:从内存参数溢出位置开始构造某个函数的内存数据,在函数返回地址处使用构造数据覆盖其地址为第一步构造的函数地址起始位置,在其返回时执行我们的函数达到目的。

上述两种位32位操作系统下的常规操作。当系统为64位那由于系统各种保护措施以及地址空间变大的原因,32位的操作方式不再适用,但并非没有办法,例如根据代码的溢出点(fget,strcpy等)通过系统调用或libc加载system函数去执行,方式变得复杂。

以下是一段shellcode,用于弹出bash窗口:

global _start
_start:
xor eax, eax
push eax
push 0x68732f6e
push 0x69622f2f
mov ebx,esp
push eax
mov edx,esp
push ebx
mov ecx,esp

mov al, 11
int 0x80

其机器码格式:

\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80

我们测试溢出利用即使用上述机器码注入程序中达到覆盖EIP地址的目的即可。

后续可结合perl、gdb、coredump文件分析获取EIP返回地址并替换为上述机器码的地址即可正常弹出shell。

此处不做详细解析,网络上也有相关的案例,还请大家自己尝试。

二、使用vim修改执行文件

首先使用objdump找到要修改的EIP地址,然后使用vim的十六进制编辑模式打开可执行文件并修改相关EIP地址达到绕过的目的。

以上就是一些有关漏洞的基本利用原理,谢谢观看。

猜你喜欢

转载自blog.csdn.net/afk_02/article/details/118157766