一.gcc编译指令以及对应保护
| 编译选项 | checksec 检测项 | 作用 | 典型输出(Enabled/Disabled) |
默认编译gcc pwn.c -o pwn | CANARYNXPIERELRO | 启用所有保护 | CANARY: EnabledNX: EnabledPIE: EnabledRELRO: Full |
-fno-stack-protector | CANARY | 禁用栈溢出保护(Canary) | CANARY: Disabled |
-z execstack | NX | 允许栈执行(关闭 NX) | NX: Disabled |
-no-pie | PIE | 禁用地址随机化(PIE) | PIE: Disabled |
-Wl,-z,now | RELRO | 启用 Full RELRO(重定位只读) | RELRO: Full |
-Wl,-z,lazy | RELRO | 启用 Partial RELRO | RELRO: Partial |
-static | 所有保护 | 静态链接(无动态库依赖) | NX: Enabled(静态代码段不可执行)PIE: Disabled(静态编译无 ASLR) |
二.项目推荐
在github上有很多可以一键部署的项目
如:
ctf-docker-template,ctf_xinetd
还有很多其他项目都可以一键部署
我这里推荐使用ctf-docker-template,对正准备出题的新手非常友好,功能齐全,各种方向都有
三.遇到的一些问题
一般打pwn的都会用到虚拟机,比如kali,Ubuntu等
这里使用的是Ubuntu,不清楚kali是否会出现一样的问题
1. 虚拟机环境配置问题
我用来打ctf的环境就一个:vm上的Ubuntu24.04虚拟机
由于是新版本,有的博客又比较老了,所以很多指令不适用
千辛万苦配置完pwn环境,现在出题时又是一堆问题,比如docker配置问题,我的docker不知道怎么回事一直拉不了镜像,问ai又是各种问题,
网上又搜不到相关信息,索性就直接买了个云服务器,系统是ubuntu22.04,就解决了很多问题,总而言之就是不能随便按照网上说的乱改
最终解决办法就是重装虚拟机
至于详细问题下面再讲
2.题目编译问题
由于我的虚拟机环境有一点小问题
所以一开始我用云服务器开了个ubuntu24.04容器,然后在容器中编译题目,编译好后用ROPgadget一查,根本没有什么gadget,
0x000000000040115d : pop rbp ; ret
0x000000000040101a : ret
0x000000000040105a : ret 0xffff
只有这些,但是我出的题目是需要像pop rdi ;ret这样的gadget的,一问ai就说是源代码里面没有调用像read,puts等libc函数,但是我的源代码里面确实调用了,之后又说ubuntu24.04libc版本有问题,程序太小了什么的
因此我换了个ubuntu18.04版本的容器
在这个容器编译后,那些该有的gadget也有了,第二天,打开电脑,再一次ROPgadget,那些gadget又消失了又变成了
0x000000000040115d : pop rbp ; ret
0x000000000040101a : ret
0x000000000040105a : ret 0xffff
这种情况,并且checksec之后保护也和我昨天checksec完全不同了,本来是开了NX保护的,结果第二天又关了,简直离了个大谱
后来问了一些大佬,说ubuntu18.04版本太老了,于是我又换成了ubuntu22.04
然后编译,保护正常了,gadget又没了
于是我准备听ai的,写一个gadgets.S文件
.intel_syntax noprefix
.section .text
.global gadget_pop_rdi_ret
gadget_pop_rdi_ret:
pop rdi
ret
.global gadget_pop_rsi_r15_ret
gadget_pop_rsi_r15_ret:
pop rsi
pop r15
ret
.global gadget_pop_r12_r13_r14_r15_ret
gadget_pop_r12_r13_r14_r15_ret:
pop r12
pop r13
pop r14
pop r15
ret
.global gadget_ret
gadget_ret:
ret
.att_syntax prefix
首先
gcc -c gadgets.S -o gadgets.o
生成一个gadgets.o
接着再
gcc -no-pie -fno-stack-protector -O0 ezstack.c gadgets.o -o ezstack
将gadgets.o一起编译进去
这样,我需要的gadgets就有了
题目编译的问题就解决了
3.Dockerfile配置问题
由于一开始我的Dockerfile是叫ai帮我写的,所以后期出现了一大堆问题
这里子确实脑子进水了,不该跟着ai来的
所以最好不要跟着ai瞎搞,问题只会越来越复杂
关于这个问题,最好的解决方法就是直接用github项目里自带的Dockerfile
这些项目往往有专门的Readme.md文件只需跟着介绍来改就行了
我暂时就遇到这些问题了,以后再遇到其他类型问题会继续更新

Comments NOTHING