pwn入门

PWN 是一个黑客语法的俚语词 ,是指攻破设备或者系统 。发音类似"砰",对黑客而言,这就是成功实施黑客攻击的声音--砰的一声,被"黑"的电脑或手机就被你操纵了 。

斗哥认为解决PWN题就是利用简单逆向工程后得到代码(源码、字节码、汇编等),分析与研究代码最终发现漏洞,再通过二进制或系统调用等方式获得目标主机的shell 。

0x02 解题步骤

1. 逆向工程:

逆向是PWN解题的第一步,但不是PWN题的重点。所以只要知道简单的逆向工具的使用步骤。最终目的是得到代码(源码、汇编等)。

掌握工具:

IDA Pro

2. 分析代码:

分析代码步骤也就是漏洞挖掘,这是PWN解题最重要的一步。

对逆向工程的结果进行静态分析或对程序进行动态调试,找出程序中存在的漏洞。大多数PWN题都存在常见的漏洞 。

掌握工具:

静态分析:IDA Pro

动态调试:gdb(with peda or gef)、windbg、ollydbg

掌握技能:

1. C语言:变量声明、常见函数的使用、熟悉常见漏洞函数等

2. 汇编语言:程序执行、函数栈帧、函数调用等

3.漏洞利用:

根据分析代码步骤得出的漏洞点,使用漏洞利用方式对漏洞进行利用,编写初步的exp。

掌握工具:

pwntools、zio

掌握技能:

1. 熟悉程序各种保护机制的绕过方式

2. 掌握ELF文件基本概念

3. 熟悉Linux系统如何加载ELF程序

4. getshell:

到了getshell步骤 ,PWN题基本已经解出来了,把我们漏洞利用步骤的exp替换成获取系统shell的code形成最终exp,就可以拿到主机的shell权限获取flag。

分两种情况:

(1) 内存程序中有getshell函数或指令时,直接调用/劫持。

(2) 存程序中没有getshell函数或指令时, 就要编写shellcode。

getshell函数如:system("/bin/sh")

掌握工具:

pwntools、zio

掌握技能:

1. 系统调用方式

2. 学习shellcode基本原理

3. 学习如何编写shellcode

4. 学习plt & got表在程序运行时的功能

0x03 常见的漏洞介绍

在分析代码步骤时,有些漏洞是经常出现,所以我们应该事先了解常见的漏洞,这样可以让我们在分析代码时事半功倍。

下面斗哥简单列举一些漏洞,相关漏洞的详细介绍可以到Wiki学习。

1. 缓冲区溢出:

缓冲区溢出包括:堆溢出、栈溢出、bss溢出、data溢出。这些溢出通常覆盖指针,造成程序执行劫持。其中栈溢出是出题最多的一个缓冲区溢出漏洞,也是斗哥PWN系列文章的重点。

2. 整数溢出:

整数溢出通常是指:无符号型与有符号的转换 、整数加减乘除法。整数溢出通常会进一步转换为缓冲区溢出、逻辑漏洞等其他漏洞。

3. 格式化字符串:

格式化字符串通常是指:程序使用printf(s),sprintf(s),fprintf(s)等函数格式字符且未作任何处理。可能导致任意地址读写 、泄露函数地址。

4. 逻辑漏洞:

逻辑漏洞主要形成原因是程序访问时,或者处理数据不当而引发的漏洞。主要漏洞有访问控制,协议漏洞,条件竞争等。

### BUUCTF PWN 入门教程与解题方法 #### 一、PWN题目概述 PWN是一种CTF竞赛中的常见类别,主要涉及程序漏洞利用技术。BUUCTF平台提供了丰富的PWN练习题,适合初学者学习并掌握基本的漏洞挖掘和利用技巧[^1]。 #### 二、工具准备 在解决BUUCTF上的PWN题目之前,需要准备好必要的环境和工具: - **操作系统**: 推荐使用Ubuntu或Kali Linux作为实验环境。 - **编程语言**: Python是最常用的脚本编写语言,尤其是`pwntools`库可以极大简化payload生成和交互过程[^4]。 - **调试器**: 使用GDB进行动态分析,配合PEDA插件增强功能[^2]。 - **静态分析工具**: `checksec`用于查看目标可执行文件的安全特性设置情况。 #### 三、典型解题流程 以下是针对BUUCTF上简单PWN题目的通用解决方案框架: ##### 1. 静态分析 通过`file`命令确认目标文件类型及其架构;运用`strings`查找可能存在的敏感字符串;借助`readelf`, `objdump`等进一步了解ELF结构细节以及是否存在保护机制如NX, ASLR等[^3]。 ```bash $ file pwn1 $ strings pwn1 | grep win $ checksec pwn1 ``` ##### 2. 动态调试 启动GDB加载待测程序,在可疑位置设断点观察寄存器状态变化及内存布局状况。如果存在栈溢出,则尝试定位返回地址被覆盖的具体偏移量。 ```python from pwn import * context.log_level='debug' io = process('./pwn1') gdb.attach(io,"b *0x4011a6\nc") io.recvuntil('>') io.sendline(cyclic(1024)) io.wait() core = io.corefile stack = core.rsp offset = cyclic_find(stack) print(f"Offset is {offset}") ``` ##### 3. 构造Payload 基于前面获得的信息设计合适的载荷数据包送入服务端触发预期行为完成Flag获取操作。 ```python payload = flat({ offset: [ next(u.search(b'/bin/sh\x00')), elf.symbols['system'] ] }) p.sendlineafter('> ', payload) p.interactive() ``` 以上仅为理论模型展示,请根据实际遇到的不同类型的挑战灵活调整策略。 #### 四、注意事项 - 学习过程中注重理解原理而非机械模仿现有代码片段。 - 多加实践积累经验,逐步深入探索更复杂的攻击手法比如ROP链构造等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值