当前位置: 首页 > news >正文

pwn练习笔记19-20

pwn_019

前置知识

/proc

/proc是一个虚拟文件系统,而是由内核在内存中动态生成,用于暴露内核和进程的运行时信息,每个运行中的进程在/proc下都有一个以 PID 命名的子目录(例如/proc/1234/),当前进程可以通过/proc/self/访问自身的信息。

fork()

fork()是一个系统调用,用于创建一个新进程(子进程)。当你调用fork()时,操作系统会复制当前进程(称为父进程)的几乎一切,关键是,子进程从fork()返回处开始执行,而不是从程序开头。

被调用一次,但返回两次

  • 在父进程中,fork()返回子进程的PID

  • 在子进程中,fork()返回0

  • 如果出错,返回-1

文件描述符(FD)

文件描述符(File Descriptor,简称 FD)是 Linux 和 Unix 系统中用于标识打开的文件、管道、网络连接等 I/O 资源的整数

每个 Linux 进程启动时,默认会打开三个文件描述符

文件描述符名称对应流比喻
0stdin标准输入程序的“耳朵”
1stdout标准输出程序的“嘴巴”
2stderr标准错误程序的“呼救”
  • stdin (0):程序从这读取输入(比如键盘输入)。

  • stdout (1):程序把正常输出写到这里(显示在终端)。

  • stderr (2):程序把错误信息写到这里(也显示在终端,但可以与 stdout 分开重定向)。

在终端运行程序时,这三个描述符默认都指向终端设备。

文件描述符与重定向:重定向的本质就是修改文件描述符表,让某个描述符指向不同的文件或设备。

  • command > out.txt:将标准输出(fd 1)重定向到文件out.txt,之后command写入 fd 1 的内容都会进入文件。

  • command 2>&1:将标准错误(fd 2)重定向到当前标准输出(fd 1)指向的地方,这样错误信息也会和正常输出合并。

在做题目时后,当遇到fclose(stdout);这会关闭文件描述符1(标准输出)。fd 0 和 fd 1 实际上都指向同一个双向通道(比如伪终端或 socket 连接)。我们可以通过重定向将本该输出到 fd 1 的数据强行塞给 fd 0,这样数据就能从输入通道传回来,显示在屏幕上。

exec cat /ctf* 1>&0 # &0代表文件描述符0

exec

在 Linux 中,exec是一系列系统调用的统称(如execlexecvexecvp等)。

作用:用一个新的程序替换当前进程的代码、数据、堆和栈。执行exec后,当前进程的进程 ID(PID)不变,但运行的内容完全变成了新程序,并从新程序的main函数开始执行。

  • 如果原来的程序正在运行,调用exec后,原来的代码就被“覆盖”了,不再执行。

  • exec通常与fork配合使用:父进程fork创建子进程,子进程调用exec加载新程序,这样父进程和子进程就可以运行不同的代码。

题解

进行IDA反汇编,其中:

  • wait():暂停主进程,等待子进程

  • fclose():关闭文件输出流

此时结合前置知识,也就很容易明白了,在if中fork()返回他的PID数,必定使主进程的判断为真,但是子进程中返回为0,就会判断为假,此时文件输出流被关闭,但是可以用重定向符,强制输出

exec cat /ctf* 1>&0
cat /ctf* 1>&0

pwn_020

前置知识:

动态程序是怎么找到动态链接库(libc)里的puts()函数的?

它需要查两张表

  • PLT (Procedure Linkage Table - 过程链接表):就像一个“中转站”,负责跳往 GOT 表。

  • GOT (Global Offset Table - 全局偏移表):就像一本“电话簿”,里面记录了puts()函数的真正内存地址。

GOT表通常被细分为两个部分,.got管变量(全局+静态),.got.plt管函数,且函数的地址是“按需”解析的

举个实际例子(printf 调用流程):
  1. 程序执行call printf时,实际跳转到.plt里的printf@plt指令;

  2. printf@plt会去.got.plt里找printf的真实地址;

  3. 如果是第一次调用,.got.plt里存的是 “动态链接器的地址”,会先让动态链接器解析出printf的真实地址,写入.got.plt

  4. 后续调用printf时,直接从.got.plt拿地址执行,不用再解析。

漏洞点:如果这本“电话簿”(GOT表)是可写的,黑客就可以把puts()的地址涂掉,换成system()的地址。这样程序只要一调用puts,实际上执行的就是system了。这种攻击叫GOT Hijacking(GOT 劫持)

什么是 RELRO 保护?

RELRO(RELocation Read-Only)是一种可选的二进制保护机制,用于增加程序的安全性。它主要 通过限制和保护全局偏移表(Global Offset Table,简称 GOT)和过程链接表(Procedure Linkage Table,简称 PLT)的可写性来防止针对这些结构的攻击。

它有三种等级:

  • No RELRO:电话簿完全不设防,你想怎么改就怎么改。.got 和 .got.plt 都是 WA (可写)。

  • Partial RELRO(部分保护):电话簿的一部分(如编译信息)被锁死,但关键的函数跳转部分 .got.plt 还是 WA (可写)。

  • Full RELRO(全保护):电话簿在程序启动时就彻底焊死了。整个 GOT 表都是 R (只读)。任何修改都会导致程序崩溃。

实战

这个题目是一个内存写入测试器,接受一个内存地址,如果写入成功:打印该地址现在的内容,否则程序崩溃。

第一步:检查保护状态

checkesc 检测保护

checksec pwn

发现 RELRO: No RELRO

第二步:寻找表的地址

我们需要查阅 ELF 文件的“户口本”。使用readelf命令查看所有的节(Sections):

readelf -S pwn

注:

ELF 文件的节头表(Section Header Table)记录了每个节(如代码段、数据段、GOT表、PLT表等)的名称、类型、地址、大小、权限等关键信息。

节:ELF(Executable and Linkable Format)是 Linux 下可执行文件、目标文件(.o)、共享库(.so)的标准格式。它内部被划分为多个,每个节存储特定类型的数据。

  • .text:程序的机器代码(只读)。

  • .data:已初始化的全局变量(可读写)。

  • .bss:未初始化的全局变量(运行时才分配空间)。

  • .got.got.plt:我们刚刚聊过的全局偏移表(存储外部变量和函数的地址)。

  • .plt:过程链接表(辅助动态函数调用)。

  • .rodata:只读数据(如字符串常量)。

  • .symtab:符号表(函数名、变量名等)。

  • .strtab:字符串表(符号名实际存储的地方)。

在输出的大表中,寻找以下两项:

寻找 .got: 在输出列表中找到 .got 行。你需要记录它的 Addr(比如 0000000000600f18)。 看它的 Flg(标志位)列:如果是 WA,其中 W 代表 Write(可写)。 寻找 .got.plt: 同理,找到 .got.plt 的地址(比如 0000000000600f28),并确认其标志位是否也有 W。

Address:该节在虚拟内存中的起始地址(加载后)flag节的属性标志:W(可写)A(加载时分配内存)X(可执行)

第三步:利用程序行为进行验证

./pwn 0x600f18

得出验证,可以写入

师承:一只枷锁

http://www.jsqmd.com/news/470323/

相关文章:

  • 【图像去噪】量子物理薛定谔方程解的自适应去噪(含 SSIM PSNR MMSE)【含Matlab源码 15147期】
  • 【Azure Container App】Debug Console的调试工具试验(三)--openssl/traceroute/ca-certificates/bind-utils/tcpping
  • Python代码如何加密之后再执行?
  • Adobe Dreamweaver 完整操作步骤(全版本通用)
  • 【VSCode学习02】 Visual Studio Code简介
  • 计算机毕业设计源码:基于Python的商品数据分析与随机森林销量预测系统 Django 可视化 数据分析 机器学习 爬虫 深度学习 大模型 大数据(建议收藏)✅
  • salesforce零基础学习(一百四十四)External Client App浅谈
  • mac电脑查看安装的mysql版本以及启动
  • 算法设计中的抽象数据类型与泛型思维的技术6
  • 第三方应用程序漏洞
  • 免费用上AI翻译!简约翻译 + Cerebras大模型,网页翻译从此告别机器腔— 全程零费用,5分钟搞定 —
  • CTFshow web入门 web1-10
  • PTA 2025年天体模拟赛L3-1 City不City (C++ 含代码解释)
  • 有效的字母异位词 - 题目笔记
  • 中控IFace考勤机二开内存问题解决方案
  • 【IEEE出版、连续五届EI稳定检索、211高校主办】第六届信号图像处理与通信国际学术会议(ICSIPC 2026)
  • 使用 C++、YOLO 和 ONNX Runtime 实现实时目标检测的完整教程整理与代码实现指南。
  • Flutter 三方库 graph_kit 的鸿蒙化适配指南 - 让逻辑治理回归“拓扑之美”,打造鸿蒙应用专家级的图算法与依赖治理中台
  • 教你如何用GPT-来分析你的dump文件定位内存泄漏问题——避免无效加班必备神器
  • 高可用高并发微服务架构设计:Nginx 与 API Gateway 的协同实践
  • Xsvn:鸿蒙系统首款SVN客户端
  • ImageToTensor函数的完整实现版本,專門用在 .NET MAUI + YOLOv8 ONNX 推理流程中
  • 基于51单片机手机无线蓝牙APP遥控智能车系统论文
  • DeepSORT 参数调优指南(实用版,针对工业/安防/实时场景)
  • 使用surging 常见的几个问题
  • HTML粒子爱心代码
  • 指针与数组:高效访问的秘诀
  • 918. 环形子数组的最大和
  • JavaScript性能优化实战孟盎
  • 筑牢 AI Agent 关键业务落地的生命线:数据治理与 AI 治理的全体系解析与落地指南