PWN保护机制以及编译方法

本文详细介绍了PWN中的四种保护机制:RELRO、Stack、NX和PIE,并通过实例展示了如何在GCC中启用或禁用这些保护措施。通过对比分析不同保护级别的二进制文件,帮助读者理解每种保护机制的具体作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入

Ctf中的pwn题,在利用gcc编译的时候,保护是如何开启的,如何编译出来的,保护都有什么由于在ctf中,大部分都是linux pwn,Windows pwn很少见,所以我这里以linux pwn来举例。

PWN的保护

在pwn里,保护一共是四种分别是RELRO、Stack、NX、PIE。
1.RELRO(ReLocation Read-Only):分为两种情况,第一种情况是Partial RELRO,这种情况是部分开启堆栈地址随机化,got表可写,第二种,Full RELRO是全部开启,got表不可写,Got表是全局偏移表,里面包含的是外部定义的符号相应的条目的数据段中,PLT表,是过程链接表/内部函数表,linux延迟绑定,但是最后还是要连接到Got,PLT表只是为一个过渡的作用。
2.Stack(canary):这个保护其实就是在你调用的函数的时候,在栈帧中插入一个随机数,在函数执行完成返回之前,来校验随机数是否被改变,来判断是否被栈溢出,这个我们也俗称为canary(金丝雀),栈保护技术。
3.NX(no execute):为栈不可知性,也就是栈上的数据不可以当作代码区执行的作用。
4.PIE(Position Independent Executable):PIE的中文叫做,地址无关可执行文件,是针对.text(代码段&

### PWN 中 GDB.Attach 和 Pause() 的使用 #### 使用 `gdb.attach` 进行调试 当利用 pwntools 库中的 `gdb.attach()` 方法来启动 GDB 并附加到目标进程中时,可以实现对二进制文件的动态分析。此方法通常用于暂停正在运行的目标进程以便设置断点、查看寄存器状态或内存内容等操作。 ```python from pwn import * io = process('./vuln_program') gdb.attach(io, gdbscript=''' b *main+0x1a # 设置断点于 main 函数偏移地址处 c # 继续执行直到遇到断点 ''') # 此时程序将在指定位置停止等待进一步指令 io.sendlineafter('>', 'input data') # 向程序发送输入数据 ``` 上述代码片段展示了如何通过传递给 `gdbscript` 参数自定义的一系列GDB命令字符串来控制调试过程[^2]。 #### 结合 `pause()` 实现交互式调试 为了使调试更加灵活可控,在调用 `gdb.attach()` 后立即跟上 `pause()` 可让脚本在此处挂起并提示用户按下任意键继续。这种方式特别适合那些希望能够在特定时刻介入调试流程的情况: ```python def debug_with_pause(): io = process('./target_binary') gdb.attach(io) pause() payload = cyclic(100) # 构造payload io.sendline(payload) if __name__ == '__main__': context.log_level='debug' # 设定日志级别为debug以获得更详细的输出信息 debug_with_pause() ``` 这里展示了一个简单的例子,其中包含了创建一个新的子进程实例以及在其上调用 `gdb.attach()` 来开启GDB调试环境;紧接着调用了 `pause()` 让当前线程阻塞直至收到用户的按键事件再恢复执行[^1]。 #### 编译选项配置 对于64位Linux平台上的C/C++源码编译成可被轻松逆向工程和漏洞挖掘的形式,建议采用如下所示不含PIE保护机制且禁用栈防护功能的GCC参数组合: ```bash gcc -no-pie -fno-stack-protector -z execstack -m64 -o output_file source_code.c ``` 这些标志能够确保最终生成的ELF格式可执行文件具有固定的加载基址,并允许堆栈区域内的代码被执行,从而简化了某些类型的攻击面研究工作[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆向萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值