PWN保护机制以及编译方法

admin 2022年11月9日13:11:51评论32 views字数 2325阅读7分45秒阅读模式

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

PWN保护机制以及编译方法

0x00 声明


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


PWN保护机制以及编译方法

0x01前言


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



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保护开启,每次程序启动的时候都会变换加载地址。


PWN保护机制以及编译方法

0x03 编译


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

PWN保护机制以及编译方法

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

PWN保护机制以及编译方法

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

这是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覆盖掉,从而来保证,缓冲区是否被溢出区别动调的时候会额外到一个地方来确认,是否被覆盖。

PWN保护机制以及编译方法

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


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

未开启pie:

PWN保护机制以及编译方法


PWN保护机制以及编译方法

0x04总结


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


PWN保护机制以及编译方法
PWN保护机制以及编译方法
PWN保护机制以及编译方法

▇ 扫码关注我们 ▇

长白山攻防实验室

学习最新技术知识


原文始发于微信公众号(长白山攻防实验室):PWN保护机制以及编译方法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月9日13:11:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PWN保护机制以及编译方法http://cn-sec.com/archives/1399756.html

发表评论

匿名网友 填写信息