缓冲区溢出保护机制——Linux

摘要:
缓冲区溢出保护机制Linuxcanary(堆栈保护)堆栈溢出保护是一种减轻缓冲区溢出攻击的方法。当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖堆栈上的返回地址,以执行shellcode。在Linux中,我们称cookie信息为金丝雀。相当于Windows下的DEP。引入PIE的原因是允许在随机地址加载程序,从而减轻缓冲区溢出攻击。
缓冲区溢出保护机制 Linux

canary(栈保护)

栈溢出保护是一种缓冲区溢出攻击的缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。

当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,该cookie往往放置在ebp/rbp的正上方,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。

攻击者在覆盖返回地址的时候也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。

gcc在4.2版本中添加了栈保护的编译参数:

-fstack-protector:只为局部变量中包含长度不小于8byte的char数组的函数插入保护代码

-fstack-protector-all:满足以下三个条件都会插入保护代码:

1、局部变量的地址作为赋值语句的右值或函数参数

2、局部变量包含数组类型的局部变量,不管数组长度

3、带register声明的局部变量

缓冲区溢出保护机制——Linux第1张

缓冲区溢出保护机制——Linux第2张

FORTIFY

先看一个例子:

void fun(char *s) {
    char buf[0x100];
    strcpy(buf, s);
    /* Don't allow gcc to optimise away the buf */
    asm volatile("" :: "m" (buf));
}

用包含参数-U_FORTIFY_SOURCE编译:

08048450 <fun>:
  push   %ebp               ; 
  mov    %esp,%ebp

  sub    $0x118,%esp        ; 将0x118存储到栈上
  mov    0x8(%ebp),%eax     ; 将目标参数载入eax
  mov    %eax,0x4(%esp)     ; 保存目标参数
  lea    -0x108(%ebp),%eax  ; 数组buf
  mov    %eax,(%esp)        ; 保存
  call   8048320 <strcpy@plt>

  leave                     ; 
  ret

用包含参数-D_FORTIFY_SOURCE=2编译:

08048470 <fun>:
  push   %ebp               ; 
  mov    %esp,%ebp

  sub    $0x118,%esp        ; 
  movl   $0x100,0x8(%esp)   ; 把0x100当作目标参数保存
  mov    0x8(%ebp),%eax     ; 
  mov    %eax,0x4(%esp)     ; 
  lea    -0x108(%ebp),%eax  ; 
  mov    %eax,(%esp)        ; 
  call   8048370 <__strcpy_chk@plt>

  leave                      ; 
  ret

可以看出,gcc生成了一些附加代码,通过对数组大小的判断替换strcpy, memcpy, memset等函数名,达到防止缓冲区溢出的作用。

NX

NX即No-eXecute(不可执行)的意思,NX的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常。

等同于Windows下的DEP。

gcc编译器默认开启NX选项,通过-z execstack可以关闭NX。

PIE

Position-Independent-Executable是Binutils,glibc和gcc的一个功能,能用来创建介于共享库和通常可执行代码之间的代码。

标准的可执行程序需要固定的地址,并且只有被装载到这个地址才能正确执行,PIE能使程序像共享库一样在主存任何位置装载,这需要将程序编译成位置无关,并链接为ELF共享对象。

引入PIE的原因就是让程序能装载在随机的地址,从而缓解缓冲区溢出攻击。

gcc的-pie和fpie选项

RELRO

设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。

Partial RELRO: gcc -Wl, -z, relro:

ELF节重排

.got, .dtors,etc. precede the .data and .bss

GOT表仍然可写

Full RELRO: gcc -Wl, -z, relro, -z, now

支持Partial RELRO的所有功能

GOT表只读

Linux下查看保护机制

checksec

用来检查可执行文件属性,例如PIE, RELRO, PaX, Canaries, ASLR, Fortify Source等等属性。

gdb peda插件:

缓冲区溢出保护机制——Linux第3张

pwntools:

缓冲区溢出保护机制——Linux第4张

缓冲区溢出保护机制——Linux第5张

免责声明:文章转载自《缓冲区溢出保护机制——Linux》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇服务管理程序,检测服务是否存在,如果不存在,启动它iOS开发~蓝牙开发下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C++雾中风景番外篇4:GCC升级二三事

最近将手头上负责的项目代码从GCC 4.8.2升级到了GCC 8.2。(终于可以使用C++17了,想想后续的开发也是很美好啊~~)不过这个过程之中也遇到了一些稀奇古怪的问题,在这里做一个简单的记录,希望后续有同学遇到类似的问题能作为参考。 1. error: unable to find string literal operator 'operator"...

10 深入kubernete落地实践深入101 ingress四层代理、session保持、定制配置、流量控制

深入Ingress-Nginx Deployment?   https 四层代理    访问控制 定制配置 项目 8-ingress 修改部署ds方式 Deployment 改成DaemonSet(ds)模式 #保存controller到文件 kubectl get deploy -n ingress-nginx nginx-ingress-control...

ASP操作COOKIE

◆什么是 Cookie?Cookie 其实是一个标签,经常可能听到的中文翻译:小舔饼。当你访问一个需要唯一标识你的站址的 WEB 站点时,它会在你的硬盘上留下一个标记,下一次你访问同一个站点时,站点的页面会查找这个标记。每个 WEB 站点都有自己的标记,标记的内容可以随时读取,但只能由该站点的页面完成。每个站点的Cookie与其他所有站点的Cookie存在...

Tornado 【简述】

前言 python 旗下,群英荟萃,豪杰并起。单是用于 web 开发的,就有 webpy、web2py、bottle、pyramid、zope2、flask、tornado、django 等等,不一而足。最近几年较为流行的,大概也就是flask、tornado 和 django 了。 关于以上各个 web 开发框架的性能比较,上网一搜,铺天盖地——这不是...

Asp.net 服务器Application,Session,Cookie,ViewState和Cache区别

2.8 Context 的使用Context 对象包含与当前页面相关的信息,提供对整个上下文的访问,包括请求、响应、以及上文中的Session 和Application 等信息。可以使用此对象在网页之间共享信息,从而实现页面间的传值。与使用 Form 的方法类似,该方法也能保持大量的数据,缺点也相同,但使用方法相对比较简单。示例如下:Src.aspx:Co...

kali之sql注入

ASP:1.网址后面加上一撇 ' 报错 and 1=1 正常显示,and1=2报错 网址:http://www.kfzhongzhou.com/cyjb_xx.asp?id=14 (get注入)2.kali Linux打开终端 输入命令 sqlmap -u 网址 --dbs --current-user (-u 输入目标网址 --dbs表示所有的数据库)3...