Pwn入门系列6——linux保护机制

保护机制

Canary
NX
ASLR
PIE
RELRO

CANARY

①canary中文翻译是金丝雀,来源是之前科技不发达时,旷工会在下井作业时带一个金丝雀,用来片段地下环境有没有煤气之类的毒气泄露,金丝雀没事,大家继续干活;如果金丝雀死了,大家赶紧跑。
②在linux中,canary的作用就如同他引用的一样,用来判断程序的执行环境,主要是针对检测栈溢出。
③canary是一个开头字节为\x00的一段长度为8个字节的随机数,这个随机数本身存放于fs段偏移为0x28的区域。
④在每次函数调用中,程序都会将这段随机数存放于栈底,每次运行结束返回时,都会将这个随机数与它的本体进行比对。
⑤如果这个值被改变,则意味着发生了栈溢出,程序直接退出,如果没有改变,程序会继续执行。
⑥由于canary开头字节为\x00,所以通常情况下不能被打印出来。
⑦通常情况下,程序如果开起来canary保护,大概率说明这道题目不是栈溢出题目了。当然也要具体情况具体分析。
⑧绕过方法主要就是修改canary或者泄露canary。

NX

①NX的意思就是Not Executable,开启这个保护后,程序中的堆、栈、bss段等可写的段就不可以执行。
②这就意味着如果开启了NX保护,通常情况下我们就不能执行我们自己编写的shellcode。
③绕过方式通常是用mprotect函数来改写段的权限,nx保护对于rop或者劫持got表利用方式不影响。

PIE和ASLR

①在我们编写ROP或者shellcode时,有一个问题是绕不开的,那就是找到函数地址。
②PIE指的就是程序内存加载基地址随机化,意味着我们不能一下子确定程序的基地址。
③ASLR与其大同小异,ASLR是程序运行动态链接库、栈等地址随机化。
④通常来说,CTF中的PWN题与这两个保护打交道的次数最多。
⑤绕过方式就是泄露函数地址,然后通过函数的偏移来确定基地址。

RELRO

①这个保护主要针对的是延迟绑定机制,意思就是说got表这种和函数动态链接相关的内存地址,对于用户是只读的。
②开启了这个保护,意味着我们不能劫持got表中的函数指针。