news 2026/4/22 23:50:04

CTF Pwn模块系列分享(二):汇编基础+Linux内存模型拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CTF Pwn模块系列分享(二):汇编基础+Linux内存模型拆解

CTF Pwn模块系列分享(二):汇编基础+Linux内存模型拆解

今天进入Pwn学习的关键前置关——汇编基础+Linux进程内存模型。

今天我不会讲复杂的底层原理,只挑Pwn解题必须用到的核心内容,用大白话+实操案例拆解,保证新手也能看懂、会用。毕竟这两块是后续学栈溢出、ROP的基础,打好基础,后面的学习会事半功倍!

一、先明确:为什么必须学汇编和内存模型?

在讲具体内容前,先解决大家的疑惑:Pwn是二进制漏洞利用,为什么非要学这些?

今天我们重点讲“x86_64架构”的汇编(CTF Pwn题90%以上是x86_64,也就是64位Linux环境),不用纠结32位,先把64位核心内容吃透。

二、汇编基础:新手必懂的核心寄存器+关键指令

汇编的核心是“寄存器”和“指令”——寄存器是CPU的“临时仓库”,指令是CPU的“操作命令”。新手不用记所有寄存器和指令,掌握下面这些Pwn高频内容就够了。

1. 高频寄存器:6个核心寄存器及其用途

x86_64有很多寄存器,但Pwn中最常用的是这6个,记住它们的分工:


小提醒:寄存器名前加“r”是64位(比如rax),加“e”是32位(比如eax),Pwn中重点关注64位。

2. 关键指令:5个高频指令,理解程序核心操作

指令是CPU的操作命令,Pwn中最常用的5个指令,拆解如下:

1. mov 目标, 源:

功能:把“源”的数据复制到“目标”(比如把内存中的数据放到寄存器,或寄存器之间传数据)。

例子:mov rax, 0x1 → 把数字1放到rax寄存器;mov rdi, [rbp+0x8] → 把rbp+0x8地址处的内存数据放到rdi。

2. push 数据:

功能:把数据压入栈中(栈是“先进后出”的结构),同时rsp会减8(64位系统,一个数据占8字节)。

例子:push rbp → 把rbp寄存器的值压入栈,rsp = rsp - 8。

3. pop 目标:

功能:把栈顶的数据弹出到“目标”,同时rsp会加8。

例子:pop rbp → 把栈顶数据放到rbp,rsp = rsp + 8。

4. call 函数地址:

功能:调用函数,核心操作有两个——① 把当前rip的值(下一条要执行的指令地址)压入栈(这就是“返回地址”);② 把rip指向函数地址。

关键:Pwn中栈溢出的核心,就是修改这个“返回地址”,让程序执行我们想执行的代码!

5. ret:

功能:函数执行结束后返回,核心操作——把栈顶的返回地址弹出到rip。

例子:函数执行完call后,执行ret,就会把之前压入栈的返回地址弹到rip,程序回到call之后的指令继续执行。

三、Linux进程内存模型:找到漏洞的内存地图

当程序运行时,操作系统会给它分配一块独立的内存空间,这块空间按功能分成不同区域——这就是“进程内存模型”。Pwn的漏洞都和“栈”相关,所以重点讲栈,其他区域简单了解即可。

1. 内存四大核心分区(从低地址到高地址)

  • 代码段(.text):存放程序的指令(比如我们刚才讲的mov、call指令),只读(不能修改)。

  • 数据段(.data/.bss):存放程序的全局变量、静态变量(比如程序里定义的int a=10)。

  • 堆(Heap):动态分配内存的区域(比如程序里用malloc申请的内存),从低地址向高地址生长。

  • 栈(Stack):存放函数的局部变量、参数、返回地址,从高地址向低地址生长(核心!Pwn漏洞高发区)。

关键记住:栈的生长方向是“从高地址到低地址”,而push指令是“往栈里加东西”,所以push会让rsp减小;pop是“从栈里拿东西”,会让rsp增大。

2. 栈帧结构:Pwn解题的核心重点

每个函数执行时,都会在栈上开辟一块独立的空间,这就是“栈帧”。栈帧由rbp和rsp界定:rbp指向栈帧底部(固定),rsp指向栈帧顶部(动态)。

一个完整的栈帧(函数调用时)结构如下(从高地址到低地址,也就是从栈底到栈顶):

  1. 函数参数(比如调用func(a,b),a是第1参数,存在rdi;b是第2参数,存在rsi,同时会压入栈)。

  2. 返回地址(call指令压入的,是函数执行完后要回到的指令地址)。

  3. 老rbp(函数开头会执行push rbp,把上一个栈帧的rbp压入栈,方便返回后恢复)。

  4. 局部变量(函数里定义的变量,比如int x=5,会存在栈帧的这个区域)。

用通俗的图理解(简化版):

[高地址] 函数参数 → 返回地址 → 老rbp → 局部变量 [低地址]

↑ ↑ ↑ rbp+0x10 rbp+0x8 rbp

Pwn核心逻辑:栈溢出漏洞,就是让“局部变量”的输入超出分配的内存空间,覆盖到“返回地址”——把返回地址改成我们想执行的代码地址,程序就会按我们的意愿执行!

四、实战小任务:用GDB看栈帧,直观理解(手把手教)

光说不练假把式,我们用一个简单的C程序,通过GDB调试,直观看看栈帧结构:

1. 准备简单C程序(保存为test.c)

#include <stdio.h> void func(int a, int b) { int x = 10; // 局部变量 printf("a=%d, b=%d\n", a, b); } int main() { func(1, 2); // 调用func,参数1和2 return 0; } }

2. 编译程序(关闭保护,方便调试)

终端执行命令:gcc -g -fno-stack-protector -z execstack -o test test.c

参数说明:-g加调试信息;-fno-stack-protector关闭栈保护;-z execstack允许栈执行(新手调试用)。

3. GDB调试,查看栈帧

启动GDB:gdb ./test

在func函数处下断点:b func

运行程序:r

查看栈帧信息:info frame → 能看到rbp、rsp的地址,以及返回地址;

查看栈内数据:x/20wx $rsp → 查看rsp开始的20个4字节数据,能看到局部变量x、老rbp、返回地址、函数参数a和b。

通过这个操作,你能直观看到栈里的返回地址、局部变量的位置——这就是后续栈溢出漏洞利用的基础!

五、新手避坑&学习建议

不要死记硬背:汇编指令和栈帧结构,结合GDB调试理解,比死记快。

先掌握64位:CTF中64位Pwn题占绝大多数,32位可以后续再补。

多调试简单程序:把刚才的test.c改一改(比如加更多局部变量、多嵌套几个函数),用GDB看栈帧变化,加深理解。

推荐工具:除了GDB,还可以用pwndbg(GDB插件,更友好),终端执行git clone https://github.com/pwndbg/pwndbg && cd pwndbg && ./setup.sh即可安装。

六、下期预告

今天我们了解了汇编基础和栈帧结构,这是后续学习栈溢出的核心前提。下期我们将进入最关键的实战环节:栈溢出基础与ret2text实战,第一次亲手构造payload,控制程序执行流!

如果今天的内容对你有帮助,别忘了点赞、在看,转发给一起学CTF的小伙伴~

CTF学习资源

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的的网安视频教程,内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,100多本网安电子书,最新学习路线图和工具安装包都有,不用担心学不全。

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 16:22:56

私有镜像推送总出错?掌握这5种排错技巧让你效率提升3倍

第一章&#xff1a;私有镜像推送失败的常见现象与影响在使用容器化技术时&#xff0c;向私有镜像仓库推送镜像是一项基础且关键的操作。然而&#xff0c;推送过程中常因配置不当或权限问题导致失败&#xff0c;进而影响持续集成与部署流程。典型错误表现 推送命令返回 unauthor…

作者头像 李华
网站建设 2026/4/23 11:13:30

灰度发布机制:先向部分用户开放新版本

灰度发布机制&#xff1a;先向部分用户开放新版本 在AI模型迭代速度不断加快的今天&#xff0c;一次看似微小的更新&#xff0c;可能带来性能飞跃&#xff0c;也可能引发全线服务崩溃。尤其当面对像 VibeThinker-1.5B-APP 这类专为高强度推理任务设计的小参数模型时&#xff0c…

作者头像 李华
网站建设 2026/4/22 17:54:29

好写作AI:你的“最强学术搭子”和“思维健身镜”

半夜改论文&#xff0c;孤独得像是在月球表面行走&#xff1f;最可怕的不是导师的修改意见&#xff0c;而是你对着自己的文字&#xff0c;开始怀疑——“我写的这坨东西&#xff0c;到底有没有意义&#xff1f;”如果你有过这种感受&#xff0c;说明你需要的已经不止是一个“工…

作者头像 李华
网站建设 2026/4/23 11:13:12

好写作AI:用好这把“学术赛车”,而不是让它替你“无证驾驶”

当AI能轻松生成一篇论文时&#xff0c;一个严肃问题浮出水面&#xff1a;这是解放生产力&#xff0c;还是打开了潘多拉魔盒&#xff1f;作为你的伙伴&#xff0c;我们必须坦诚聊聊伦理的边界——好写作AI这把“利器”&#xff0c;该如何被负责任地使用&#xff0c;才能真正为你…

作者头像 李华
网站建设 2026/4/23 16:06:26

Vue前端页面设计:可视化展示VibeThinker解题过程

Vue前端可视化展示VibeThinker解题过程 在数学竞赛训练或算法刷题时&#xff0c;你是否曾面对模型返回的一长串文本推理感到困惑&#xff1f;那些看似连贯的“思维链”中&#xff0c;关键步骤可能被淹没在冗余描述里——公式推导没有高亮、代码片段缺乏语法着色、逻辑跳跃难以…

作者头像 李华
网站建设 2026/4/23 11:12:27

别再造Agent了!关于Agent Skills的详细总结来了

一、MCP 之后&#xff0c;我们还需要什么&#xff1f; MCP&#xff08;Model Context Protocol&#xff09;由 Anthropic 团队提出&#xff0c;其核心设计理念是标准化智能体与外部工具/资源的通信方式。想象一下&#xff0c;你的智能体需要访问文件系统、数据库、GitHub、Slac…

作者头像 李华