关于 RELRO 保护的基础知识可以参考我上一篇博客 pwn20:
https://myon6.blog.csdn.net/article/details/137935702?spm=1001.2014.3001.5502
目录
1、pwn21
2、 pwn22
1、pwn21
提交ctfshow{【.got表与.got.plt是否可写(可写为1,不可写为0)】,【.got的地址】,【.got.plt的地址】}
提交 flag 类型一样,只是附件不一样
下载附件进行检查,可以看到 RELRO 保护部分开启: Partial RELRO
因此 .got 不可写而 .got.plt 可写,前半段 flag 为 ctfshow{0_1_
同样我们使用 readelf 命令显示 ELF 格式文件信息:
readelf -S pwn
找到二者的地址:0x600ff0 和 0x601000
因此最终 flag:ctfshow{0_1_0x600ff0_0x601000}
接下来我们验证 .got 和 .got.plt 是否可写:
使用 chmod 命令加上可执行权限
可以看到执行 ./pwn 0x600ff0 ,程序崩溃,也说明了 .got 段是不可写的
./pwn 0x601000 执行成功,说明 .got.plt 可写
使用 readelf -l 命令查看 ELF(Executable and Linkable Format)文件头和程序头信息:
readelf -l pwn
可以看到新增了 GNU_RELRO 信息的程序头,并且它的权限为只读(R),这意味着在程序加载后,.got 段和 .got.plt 段之间的空间将被设置为只读。
将 .init_array、.fini_array、.dynamic 和 .got 这些节(Sections)合并到一起,以形成一个可加载的程序段,这个段的权限标志为只读,表示这些节在程序加载后将被设置为只读。
2、pwn22
趁热打铁,我们继续看 pwn22
checksec pwn
检查后发现 RELRO 保护全开:Full RELRO
表明 .got 表与 .got.plt 表都不可写,因此前半段 flag 为 ctfshow{0_0_
查看 ELF 文件信息:
readelf -S pwn
这里只找到 .got 表的地址: 0x600fc0
题目中有说明:若某个表不存在,则无需写其对应地址
因此 flag:ctfshow{0_0_0x600fc0}
尝试执行但是程序崩溃,说明 .got 表是不可写的