二进制漏洞与利用学习
一、主要术语
- Binary:由编译类语言生成的可执行程序
- Vulnerability:Binary中包含的可被利用的Bug
- Exploit:借助Vulnerability来劫持Binary控制流的、经过特殊构造的数据
- 0day:可被exploit的位置Vulnerability
- Pwn:发现Vulnerability以及开发exploit的工作
二、目的:
- 获取shell
- 获取计算机上的敏感信息
- 上串并安装Malware
- 对计算机实施破坏
三、根本原因:
(1)通道问题:
- 计算机中数据和控制通道隔离性差
- 存在从数据通道信息转移到控制通道的可能
(2)逻辑问题
- 对边界条件的检查不完善
- 对内存管理不善
- 逻辑不严谨或太复杂
四、分类:
- Stack-Based
- Heap-Based
- Integer Issue
- Pointer Issue
- Format Strig Vulnerability
- Race Condition
五、基础知识(Knowledge Base)
- ELF:linux中可执行文件
PE:windows下可执行文件
PLT:程序局部表
- GOT:全局偏移表
- X86指令大小不固定,不对齐,ARM指令大小为4B,且对齐(Aligned)
六、防护机制:
1.NX/W^X
(1)解释:数据页不可执行,代码页不可写
(2)Bypass:
- ret2lib:令控制流跳转到库代码中执行
- ROP(Return Oriented Programming):从内存中寻找Gadget(每个Gadget都以return结尾,返回调用该函数的代码所在的rip后的地址)并将其组成具有一定功能的代码 ,可以用RoPgadget寻找GadGet
2.ASLR:
(1)解释: 内核、堆栈、动态库的加载地址具有随机性
开启PIE的情况下,主程序的加载基地址也随机
(2)Bypass:
- 爆破
32位环境,linux libc的加载基址为0Xf7xxx000
- 信息泄露:
获取GOT表(含大量函数指针)的内容
获取main函数返回地址
3.Stack Guard
Canaries/Cookies:在栈中的局部变量和返回地址间插入一个难以预测的值(Canary),当函数返回时,将检查Canary是否被破坏
4.StackShield:
将返回地址拷贝到影子栈中,返回时比较栈上的返址与影子栈中的返址
5.SSP
编译时对变量重排序,将函数指针放在低低址,缓冲区放在高地址