CTF培训Pwn教学PPT课件.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
定义一个局部变量,分配的内存空间是事先确定好的 ASLR为什么能防护缓冲区溢出攻击呢? 堆喷射,是一种堆和栈的协同攻击的技术。由于ASLR的干扰,通常我们无法准确控制eip落入我们shellcode中,导致exploit执行失败 堆喷射技术并不能保证100%成功,看堆结构 Canary 金丝雀,煤矿中检测瓦斯的鸟, 检测安全。 看一下开启栈溢出检测的时候程序什么样子的 为什么会出现缓冲区溢出?因为计算机不区分代码和数据,DEP对代码赋予了可执行不可写权限,对数据赋予了写不可执行权限。 认为Stack和Heap都是数据区,所以不具备执行权限。 CTF培训 ——Pwn 安全研究员 威胁情报与网络安全实验室 关注: 漏洞分析,漏洞挖掘,应急响应 * 何为Pwn? 通过利用目标的漏洞,对目标实施攻击,并最终控制目标 Pwn类题目常见漏洞 Stack Overflow(栈溢出) Heap Overflow(堆溢出) Integer Overflow(整形溢出) Format String Vulnerabilities(格式化字符串) Use After Free(释放后重用) 缓冲区溢出 保证程序需要,程序会预先分配一定大小的内存空间 向分配的内存空间写入超过分配的大小 溢出的数据会改写分配空间以外的内存单元 * 例子 void vulnerable_function() { char buf[10]; scanf( “%s”, buf); } int main(int argc, char** argv) { vulnerable_function(); printf("Hello, World\n"); } * 利用方式 利用方式 输入超长字符串 造成程序存储越界 覆盖返回地址 将返回地址指向预先填充Shellcode的内存空间 防护措施 Windows GS DEP ASLR SafeSEH SEHOP Linux RELRO Canary NX PIE PIC ASLR(PIE/PIC) Address Space Layout Randomization 地址空间分布随机化 Addr = base + offset Base -> random Bypass Leak memory( 泄漏内存 ) Attack no-ASLR module Heap Spray(堆喷射) * 内存泄漏 原理 模块中不同函数的相对位置不变 步骤 找一个程序中的导入函数 计算这个函数和需要函数的位置差 下次加载时利用导入函数地址和位置差计算需要的函数地址 调用需要的函数 堆喷射 控制EIP稳定落入Shellcode的技术 方法: 分配大量内存块 在内存块中部署超长滑行区slide 在内存块末尾部署shellcode * * GS/Canary 栈溢出检测 在栈帧中存放一个随机值cookie,在函数返回时检测这个cookie是否被修改 Bypass Leak memory( 泄漏cookie ) 覆盖 SEH ( Windows ) * 绕过GS/Canary 内存泄漏 Fork()后程序的security cookie不会变 覆盖SEH SEH在栈上 触发程序异常 跳入篡改后的SEH执行shellcode SafeSEH( Windows) nt!RtlIsValidHandler DEP/NX DEP Data Execution Protection NX No eXecute Bypass ROP( Return Orientated Programming ) Ret2libc( Return to libc ) Return to dl resolve * 堆溢出 利用堆块的溢出 重写下一个堆块的块首 而下一个堆块中可能包含其它的堆的入口地址或者已经释放的堆的节块(每个都包含前面所述的块首)。之后,当堆管理器操作堆块时(比如说申请一个新的堆块),使得操作的空间指向了重写的堆块,这个错位的块首是可以被头管理函数访问的,但这将产生一个异常,在合适的条件下可以被利用。 整数溢出 有符号型和无符号型 有符号型(signed char) 127 + 1 = -128 -128 -1 = 127 无符号型(unsigned char) 255 + 1 = 0 0 – 1 = 255 整数溢出 #include <stdio.h> #include <string.h> #define MAX 100 int main() { int n=0; char str[100]; signed char a = 0; while((int)a < MAX)

文档评论(0)

liuxing044 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档