PWN保护机制以及编译方法

0x00 声明

出品|长白山攻防实验室(ID:逆向萌新)

以下内容,来自先知社区的作者逆向萌新原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。


0x01前言

Ctf中的pwn题,在利用gcc编译的时候,保护是如何开启的,如何编译出来的,保护都有什么由于在ctf中,大部分都是linux pwn,Windows pwn很少见,所以我这里以linux pwn来举例。


0x02 PWN的保护

在pwn里,保护一共是四种分别是RELRO、Stack、NX、PIE。

1.RELRO(ReLocation Read-Only):分为两种情况,第一种情况是Partial RELRO,这种情况是部分开启堆栈地址随机化,got表可写,第二种,Full RELRO是全部开启,got表不可写,Got表是全局偏移表,里面包含的是外部定义的符号相应的条目的数据段中,PLT表,是过程链接表/内部函数表,linux延迟绑定,但是最后还是要连接到Got,PLT表只是为一个过渡的作用。

2.Stack(canary):这个保护其实就是在你调用的函数的时候,在栈帧中插入一个随机数,在函数执行完成返回之前,来校验随机数是否被改变,来判断是否被栈溢出,这个我们也俗称为canary(金丝雀),栈保护技术。

3.NX(no execute):为栈不可知性,也就是栈上的数据不可以当作代码区执行的作用。

4.PIE(Position Independent Executable):PIE的中文叫做,地址无关可执行文件,是针对.text(代码段),.data(数据段),.bss(未初始化全局变量段)来做的保护,正常每一次加载程序,加载地址是固定的,但是PIE保护开启,每次程序启动的时候都会变换加载地址。


0x03 编译

在gcc中,利用默认参数进行生成,默认生成的是RELRO、PIE、NX保护是全开的情况,但是有一些题,会针对题型的不同,来更变所开启的保护机制。

从头开始,关闭所有的保护开始关闭所有保护开始gcc -z execstack -fno-stack-protector -no-pie -z norelro -o 输出文件名 c语言文件名,来编译一个linux可执行文件,关闭所有的保护,之后再生成一个保护全开的一个文件,在相同的c语言源文件下进行生成利用命令gcc -fstack-protector-all  -o b.out lk.c,生成了一个保护全开的一个文件,进行对比分析。

两个文件,一个是保护全开,一个是全关。

这是checksec之后的结果,来看内部的不同,有一些是可以半开,半关的,那些最后说。

NX:在没有开启的时候在利用readelf-l 文件中,发现了对于栈的一个区别,在这里叫做GNU_STACK。

没有开启保护:

GNU_STACK      0x0000000000000000 0x0000000000000000 0x00000000000000000x0000000000000000 0x0000000000000000  RWE    0x10

开启NX保护:

GNU_STACK      0x0000000000000000 0x0000000000000000 0x00000000000000000x0000000000000000 0x0000000000000000  RW     0x10

开启保护之后,GNU_STACK从RWE变成了RW,栈只能进行读写,而不可以执行

RELRO:还是进行readelf -l进行查看,发现正常,没有开启RELRO中,缺少了GNU_RELRO类型,而且全部开启,只有读的权限,没有写入和执行的权限,这是RELRO全开的情。

RELRO全开:

GNU_RELRO      0x0000000000002db0 0x0000000000003db0 0x0000000000003db00x0000000000000250 0x0000000000000250  R      0x1

RELRO半开: 

GNU_RELRO      0x0000000000002de8 0x0000000000003de8 0x0000000000003de80x0000000000000218 0x0000000000000218  R      0x1

RELRO关闭:却是GNU_RELRO类型。

STACK(canary):这个是无法看出的,这个的作用在函数运行之前,插入一个cookie信息,如果你溢出的时候,往往会直接把插入的cookie覆盖掉,从而来保证,缓冲区是否被溢出区别动调的时候会额外到一个地方来确认,是否被覆盖。

左边是未开启canary的状态,是一直直接往下,返回退出,但是右边是开启canary的状态,存在一个je跳转来验证,确定这个函数的栈没有问题的情况下,才会跳转到正常退出这个函数的位置,否则就进入异常处理阶段,报错退出。

PIE:在PIE未开始和开启的话,能在debug调试器中进行分析是否开始,就是多开几个窗口,看看咱们去对这个main函数进行下断电,如果下断点的时候,main函数的地址变了,那么就是说明,这个开启了pie,如果一直不变,那么就是没有开启pie,这是本质的一个区别。

未开启pie:


0x04总结

PWN的保护其实很重要,知道了保护机制,就很可能推出这道题想要考你什么点比如NX没开,可能要考你ret2shellcode,PIE没开,RELRO半开,NX开启,金丝雀未开,可能要考你ret2text,根据这些可以大概的推算出,想要考你什么点,对于做题会有很大的帮助。

欢迎关注长春攻防实验室微信公众号定期更新优质文章及相关资源

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

推荐阅读更多精彩内容