任何编程语言和软件项目,都会存在安全漏洞,只有漏洞利用成本的高低!
本文章仅提供学习,切勿将其用于不法手段!
一、缓冲区溢出(最常见!)
原理:
汇编语言直接操作内存,如果程序向固定大小的缓冲区写入超长数据,就会像往杯子里倒满水后继续倒,水会流到桌子上(覆盖相邻内存)。攻击者利用这点覆盖关键数据(如返回地址),让程序跳转到恶意代码执行。
渗透测试利用方法:
- 构造超长输入:比如登录时输入200个字符的用户名,覆盖函数返回地址。
; 假设漏洞代码(汇编片段): sub esp, 0x100 ; 分配100字节的栈空间 mov eax, [ebp+8] ; 获取用户输入地址 mov ecx, eax ; 将输入地址存入ecx mov edi, esp ; 将栈顶地址存入edi mov esi, ecx ; 将输入地址存入esi mov ecx, 0x200 ; 假设用户输入长度为500,远超分配的100字节 rep movsb ; 将输入数据复制到栈中,导致溢出 - 覆盖返回地址:用调试工具(如GDB)找到缓冲区地址,构造输入覆盖返回地址为
system("/bin/sh")的地址。 - 获取Shell:成功后程序会执行恶意命令,比如弹出计算器或打开终端。
防御:
- 用
strncpy代替strcpy,限制输入长度。 - 编译时开启栈保护(
-fstack-protector)。
二、格式化字符串漏洞
原理:
汇编中直接使用用户输入作为格式化字符串(如printf(user_input)),攻击者可输入%x泄露内存数据,或用%n修改内存值。
渗透测试利用方法:
- 泄露内存:输入
%x.%x.%x,程序会输出栈上的敏感数据(如密码、地址)。 - 修改内存:输入
\xef\xbe\xad\xde%6$n,将0xdeadbeef写入指定地址,可能劫持程序流程。
防御:
- 明确指定格式字符串,如
printf("%s", user_input)。 - 禁用危险格式符(如
%n)。
三、整数溢出
原理:
汇编中整数运算未检查溢出,比如计算缓冲区大小时,输入负数导致分配内存过大或过小,引发溢出。
渗透测试利用方法:
; 假设漏洞代码(汇编片段):
mov eax, [ebp+8] ; 获取用户输入长度(假设为负数)
sub eax, 100 ; 计算缓冲区大小,结果可能为负数
mov [ebp-4], eax ; 存储到栈中(可能覆盖返回地址)
构造输入user_input = -2000000000,导致eax为负数,覆盖关键内存地址。
防御:
- 检查输入范围,使用无符号类型。
- 开启编译器溢出检测(
-ftrapv)。
四、直接内存访问漏洞
原理:
汇编中直接操作指针,若指针未初始化或指向已释放内存,可能导致非法访问或数据泄露。
渗透测试利用方法:
- 悬垂指针:覆盖已释放内存的指针,指向恶意代码。
- 野指针:构造输入使指针指向敏感区域(如内核内存)。
防御:
- 指针初始化为
NULL,使用前检查是否为NULL。 - 释放内存后立即置空(
mov [ptr], 0)。
五、系统调用劫持
原理:
汇编中直接调用系统调用(如int 0x80),若参数被篡改,可能执行恶意操作(如提权)。
渗透测试利用方法:
; 假设漏洞代码(汇编片段):
mov eax, 0x0b ; 系统调用号(execve)
mov ebx, esp ; 参数1:指向"/bin/sh"的地址
mov ecx, 0 ; 参数2:参数数组地址
mov edx, 0 ; 参数3:环境变量地址
int 0x80 ; 触发系统调用
通过覆盖ebx指向的地址为/bin/sh的地址,执行shell。
防御:
- 限制系统调用权限。
- 使用安全API替代直接系统调用。
六、堆溢出
原理:
动态分配的堆内存未正确管理,攻击者通过溢出覆盖堆元数据(如malloc的fd指针),劫持内存分配流程。
渗透测试利用方法:
- 伪造堆块:构造恶意数据覆盖堆块头,使
malloc返回可控地址。 - 写入Shellcode:将恶意代码写入伪造的堆块,劫持程序执行流。
防御:
- 使用内存保护机制(如ASLR、DEP)。
- 启用堆保护(如
malloc的MALLOC_CHECK_)。
总结:汇编漏洞的“防身三招”
- 严格输入检查:所有用户输入必须限制长度、过滤特殊字符(如
../、%x)。 - 安全编程实践:
- 使用安全函数(如
strncpy)。 - 避免直接操作指针,改用高级语言特性。
- 使用安全函数(如
- 启用防护机制:
; 编译时开启保护 gcc -fstack-protector-strong -D_FORTIFY_SOURCE=2 -o program program.c- 地址空间随机化(ASLR):让攻击者难以预测内存地址。
- 数据执行保护(DEP):禁止栈/堆执行代码。
一句话口诀:
输入要过滤,指针别乱用,溢出要防御,保护不能少!
注:所有技术研究需遵循《网络安全法》及《数据安全法》相关规定,践行合法合规的网络安全技术探索。
提示:最有效的防御办法,是让攻击者由于攻击成本过高,而主动放弃针对目标进行攻击!
没有攻不破的城墙,只有 由于 付出成本 远超于 收获价值 而 选择 主动放弃 攻击行为 的 敌人 !

15万+

被折叠的 条评论
为什么被折叠?



