Linux程序二进制漏洞缓解机制

前言

linux系统提供了很多安全机制来降低程序受到缓冲区溢出等攻击手法的攻击,而我们需要使用这些攻击手法来进行攻击,所以就要熟悉常见的安全机制,知己知彼,才能成功实施攻击。

checksec

checksec是一个检查linux程序开启的安全机制的shell脚本,脚本并不大,可以直接从github下载并使用:
https://github.com/slimm609/checksec.sh/

gdb的peda插件也带有checksec脚本,由于我们之后还要频繁使用gdb的分析二进制程序,所以直接使用gdb-peda中的checksec

gdb-peda安装:

$ git clone https://github.com/longld/peda.git ~/peda
$ echo "source ~/peda/peda.py" >> ~/.gdbinit

安装完成后原本的gdb会变成gdb-peda

./checksec <file>
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

RELRO

RELRO机制全名是read only relocation,指定binary的一块区域使其权限变为只读。
在linux程序中,很多攻击都是由于存储数据的区域被写入恶意代码进行的,设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,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表只读

gcc中可以通过编译选项控制RELRO

gcc -o test test.c // 默认情况下,是Partial RELRO
gcc -z norelro -o test test.c // 关闭,即No RELRO
gcc -z lazy -o test test.c // 部分开启,即Partial RELRO
gcc -z now -o test test.c // 全部开启,即Full RELRO

CANARY/STACK

栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。
当启用栈保护后,函数开始执行的时候会先往栈里插入随机值,当函数真正返回的时候会验证随机值是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将随机值给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将随机值称为canary。

canary所在位置图解:


  High

  Address |                 |
          +-----------------+
          | args            |
          +-----------------+
          | return address  |
          +-----------------+
  rbp =>  | old ebp         |
          +-----------------+
rbp-8 =>  | canary value    |
          +-----------------+
          | 局部变量         |
          +-----------------+
  Low     |                 |

  Address

gcc编译时,可通过编译选项选择是否启用canary机制

gcc -o test test.c // 默认情况下,不开启Canary保护
gcc -fno-stack-protector -o test test.c //禁用栈保护
gcc -fstack-protector -o test test.c //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码
gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码

FORTIFY

FORTIFY机制用于检查程序是否存在缓冲区溢出错误,适用于memcpy,memset,stpcpy,strcpy,strncpy,strcat,strncat,sprintf,snprintf,vsprintf,vsnprintf,gets等函数。

在函数编译时,加入FORTIFY机制的代码会在编译过程中自动添加一部分代码,判断数组的大小,削减缓冲区溢出的危害。

gcc编译时,默认不开启FORTIFY机制,可通过编译选项选择开启的FORTIFY机制强度

gcc -D_FORTIFY_SOURCE=1 仅仅只会在编译时进行检查
gcc -D_FORTIFY_SOURCE=2

NX

NX是No-execute的缩写,设置NX会限制数据页面内存中不可执行代码,如果开启的话就不能让IP寄存器指向堆栈。若程序尝试在被限制内存中执行代码,CPU会抛出异常。这种防御手段可以很好的克制ret2shellcode方式的攻击手段。

gcc默认开启NX机制防止数据内存中执行代码,可以通过编译选项关闭NX机制

gcc -z execstack 关闭NX保护
gcc -z noexecstack 开启NX保护

在Windows下,类似的概念为DEP(数据执行保护),在最新版的Visual Studio中默认开启了DEP编译选项。

PIE/ASLR

PIE叫做代码部分地址无关,PIE能使程序像共享库一样在主存任何位置装载,这需要将程序编译成位置无关,并链接为ELF共享对象。

PIE和内存地址随机化机制ASLR(address space layout randomization)会同时工作,如果不开启PIE的话,那么每次ELF文件加载的地址都是相同的。如果开启PIE,那么每次都会不同。

liunx下关闭PIE的命令如下:

sudo -s echo 0 > /proc/sys/kernel/randomize_va_space

linux中ASLR的等级

在linux系统中ASLR被分为0,1,2三个等级,可以通过 sudo bash -c "echo 2 > /proc/sys/kernel/randomize_va_space" 设置。

0)没有随机化。即关闭ASLR。
1)保留的随机化。共享库、栈、mmap()分配的内存空间以及VDSO将被随机化。
2)完全的随机化。在1的基础上,通过 brk()分配的内存空间也将被随机化。

原始链接:看雪学院简书

gcc中可以通过编译选项选择不同强度的PIE

gcc -o test test.c // 默认情况下,不开启PIE
gcc -fpie -pie -o test test.c // 开启PIE,此时强度为1
gcc -fPIE -pie -o test test.c // 开启PIE,此时为最高强度2
gcc -fpic -o test test.c // 开启PIC,此时强度为1,不会开启PIE
gcc -fPIC -o test test.c // 开启PIC,此时为最高强度2,不会开启PIE

原始链接:麻薯-linux程序保护机制

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354