PWM出题过程中遇到的一些问题以及解决方法(持续更新)

alanx 发布于 2025-07-15 188 次阅读


一.gcc编译指令以及对应保护

编译选项checksec 检测项作用典型输出(Enabled/Disabled)
默认编译gcc pwn.c -o pwnCANARY
NX
PIE
RELRO
启用所有保护CANARY: Enabled
NX: Enabled
PIE: Enabled
RELRO: Full
-fno-stack-protectorCANARY禁用栈溢出保护(Canary)CANARY: Disabled
-z execstackNX允许栈执行(关闭 NX)NX: Disabled
-no-piePIE禁用地址随机化(PIE)PIE: Disabled
-Wl,-z,nowRELRO启用 Full RELRO(重定位只读)RELRO: Full
-Wl,-z,lazyRELRO启用 Partial RELRORELRO: Partial
-static所有保护静态链接(无动态库依赖)NX: Enabled(静态代码段不可执行)
PIE: Disabled(静态编译无 ASLR)

二.项目推荐

在github上有很多可以一键部署的项目

如:

ctf-docker-templatectf_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就说是源代码里面没有调用像readputslibc函数,但是我的源代码里面确实调用了,之后又说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文件

首先

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文件只需跟着介绍来改就行了

我暂时就遇到这些问题了,以后再遇到其他类型问题会继续更新

此作者没有提供个人介绍。
最后更新于 2025-07-18