Pwn专题(4)-安全机制RELRO
下面的代码通过命令行读入一个地址,然后将十六进制常量0x41414141写到地址内存里。这是缓冲区溢出的简化形式,对篡改GOT的行为进行简单的模拟。
//gcc -g -W -no-pie -z norelro relro.c -o relro_norelro #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) { size_t *p = (size_t *) strtol(argv[1], NULL, 16); p[0] = 0x41414141; printf("RELRO: %x\n",(unsigned int)*p); return 0; }
readelf -S relro_norelro

测试写.got段看程序是否运行成功。

测试写.got.plt段看程序是否运行成功。

第二种开启Partial RELRO
再来查看文件的动态重定位入口发现两种符号已经不在同一页上,说明他们的权限可能不同。
readelf -S relro_lazy

测试写.got段看程序是否运行成功。

测试写.got.plt段看程序是否运行成功。

第三种开启Full RELRO。
查看文件的动态重定位入口,发现这两个符号又位于同一页。

测试写.got段看程序是否运行成功。
