十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

pwndbg hijack-fd 命令详解:在调试中替换目标进程文件描述符

pwndbg hijack-fd 命令详解:在调试中替换目标进程文件描述符 pwndbg hijack-fd 命令详解在调试中替换目标进程文件描述符【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg导读hijack-fd是 pwndbg 提供的一类实用命令用于在调试会话中直接替换被调试进程的某个文件描述符FD将其重定向到一个文件、管道、套接字或设备等新目标。它在漏洞利用开发与逆向分析中非常实用例如在分析二进制时无需修改源码即可把 STDOUT/STDERR 重定向到/dev/null或远端 socket从而验证程序的输出逻辑、捕获网络行为或绕过输出限制。阅读本文后你将掌握hijack-fd的完整用法、参数格式、底层实现原理基于 shellcode 注入与系统调用以及配套的验证手段。hijack-fd属于 misc杂项命令分类其官方文档位于 docs/commands/misc/hijack-fd.md命令列表索引见 docs/commands/index.md。本文以该文档为主体结合源码 pwndbg/commands/hijack_fd.py 与测试用例 tests/library/gdb/tests/test_command_hijack_fd.py 展开深度讲解。命令概述与适用场景hijack-fd的命令语义是 Replace a file descriptor of a debugged process即替换被调试进程的一个文件描述符。替换后新的文件描述符可以指向文件file管道pipe套接字socket设备device如/dev/null等常见实战场景包括把程序的 STDOUTfd 1或 STDERRfd 2重定向到/dev/null屏蔽调试过程中的大量输出把标准错误重定向到本机或远端 TCP/UDP 套接字在调试环境中捕获程序运行时产生的网络流量在分析某个已打开文件描述符的程序时将其某个 fd 替换为临时文件观察程序后续对该 fd 的读写行为是否符合预期。与手动修改源码、重新编译或使用dup2等外部手段不同hijack-fd在调试器内即时生效无需重建二进制。使用方法与完整参数说明命令行语法usage: hijack-fd [-h] fdnum newfilehijack-fd接受两个必需的位置参数fdnum要替换的文件描述符编号和newfile新目标文件或套接字此外仅有标准的-h/--help帮助选项。位置参数位置参数说明fdnum要被替换的文件描述符FD编号类型为整数源码中通过typeint定义见 pwndbg/commands/hijack_fd.py。例如1对应 STDOUT、2对应 STDERR。newfile指定新目标。文件文件名必须以/开头如/etc/passwd套接字支持以下几种格式详见下文。套接字格式详解从源码 parse_socket 的实现可以看出newfile参数会被parse_file_or_socket见 pwndbg/commands/hijack_fd.py#L238-L242自动分流以/或./开头的字符串被识别为文件路径其余字符串被当作套接字地址解析。套接字支持以下格式格式说明127.0.0.1:80裸 IP 与端口默认协议为 TCPtcp://[::1]:80显式指定 TCP 协议地址为 IPv6需用方括号包裹udp://example.com:80显式指定 UDP 协议主机名可为域名会通过 DNS 解析tcpipv6://example.com:80协议与 IP 版本组合tcp/udp表示传输协议ipv4/ipv6表示地址族底层实现细节解析逻辑使用 Python 标准库urllib.parse.urlparse见 pwndbg/commands/hijack_fd.py#L9因此tcpipv6://这类 协议地址族 组合会被按拆分后分别识别域名/IP 解析使用socket.getaddrinfo见 pwndbg/commands/hijack_fd.py#L212解析失败如域名不存在时会抛出argparse.ArgumentTypeError并提示错误信息若未显式指定 IP 版本则优先尝试 IPv4失败后再尝试 IPv6最终解析结果会记录实际使用的地址族。官方示例1. 将 STDOUT 重定向到文件 hijack-fd 1 /dev/null 2. 将 STDERR 重定向到套接字 hijack-fd 2 tcp://localhost:8888工作原理从参数到系统调用的完整链路hijack-fd的核心思路是在调试器内动态生成一小段机器码shellcode将其注入被调试进程执行通过系统调用完成文件描述符替换并在执行完毕后恢复现场。整个过程对目标进程的其余状态保持透明。第一步参数分流与汇编生成命令入口 hijack_fd 根据解析结果分流若目标是文件调用 asm_replace_file生成的系统调用序列为open或openat取决于架构常量SYS_open是否存在以O_CREAT|O_RDWR模式、权限0o666打开文件dup2或dup3将新打开的 fd 复制到目标 fdnumclose关闭临时 fd。若目标是套接字调用 asm_replace_socket生成的系统调用序列为socket根据协议选择SOCK_STREAM/SOCK_DGRAM根据地址族选择AF_INET/AF_INET6connect连接目标地址dup2或dup3复制到目标 fdnumclose关闭临时 fd。汇编代码通过 pwntools 的pwnlib.shellcraft与pwndbg.aglib.asm.asm生成见 pwndbg/commands/hijack_fd.py#L11-L12、pwndbg/commands/hijack_fd.py#L64-L86因此能适配 pwndbg 支持的各种指令集架构。第二步寄存器与栈的适配系统调用参数所需的寄存器由 get_shellcode_regs 从pwndbg.lib.regs.reg_sets中按当前架构动态选取它会挑一个未被系统调用 ABI 占用的通用寄存器来暂存新 fd并获取返回值寄存器与栈指针寄存器字符串数据文件名或 sockaddr通过shellcraft.pushstr压入栈中栈大小经过 stack_size_alignment 按系统调用参数对齐规则向上取整保证栈指针满足 ABI 对齐要求。第三步在被调试进程中执行 shellcode执行由 exec_shellcode_with_stack 驱动它先保存栈上将被 shellcode 占用的原始内容随后调用pwndbg.aglib.shellcode.exec_shellcode实现见 pwndbg/aglib/shellcode.py。该执行上下文管理器做了四件关键事情保存全部通用寄存器、参数寄存器、PC 与栈指针并把 PC 前移到下一条指令边界规避 LLDB 对与 PC 重叠地址写入的限制在当前代码页内找一块足够容纳 shellcode 的空隙不足时抛 Not enough space 错误临时写入 shellcode 并保存原字节挂起所有调试事件以内部断点方式单步推进直到 shellcode 末尾期间会忽略其他断点结束后恢复原代码、原寄存器与 PC做到用完即还原。命令完成时hijack-fd会输出如下提示并建议用procinfo验证结果Operation succeeded. Errors are not captured. You can verify this with procinfo if the file descriptor has been replaced.使用限制从源码可推断命令带有OnlyWhenRunning与OnlyWhenUserspace装饰器见 pwndbg/commands/hijack_fd.py#L272-L273因此必须在程序启动且处于用户态时才能使用未运行程序时执行会提示 The program is not being run。要求当前架构定义了系统调用 ABIsyscall_abi is None时报错并存在空闲通用寄存器。shellcode 执行期间发生的系统调用错误不会被捕获源码注释明确 Errors are not captured因此命令提示成功不代表底层open/connect一定成功需要结合procinfo等命令人工核验。源文件 exec_shellcode_with_stack 注释指出该函数还有改进空间例如用 Unicorn 等模拟器执行、或动态计算 shellcode 所需的最大栈大小说明当前实现对栈空间占用有静态估算。验证方式用 procinfo 检查 FD 状态hijack-fd执行成功后并不会主动列出新的 FD 表官方推荐使用procinfo命令确认替换是否生效。procinfo会输出形如fd[0] - /dev/pts/96 fd[1] - /dev/pts/96 fd[2] - /dev/pts/96的 FD 映射行输出格式见 pwndbg/commands/procinfo.py。执行hijack-fd后再运行procinfo若对应fd[n]的目标已变为你指定的文件或 socket则说明替换成功。procinfo的完整说明见 docs/commands/process/procinfo.md。测试用例行为边界的实证仓库在 tests/library/gdb/tests/test_command_hijack_fd.py 中提供了完整的集成测试可作为行为边界的权威参考测试场景验证要点文件重定向把 fd 1 替换为临时文件后调用write(1, ...)文件内容应包含写入的字符串再用procinfo确认fd[1]指向该文件TCP 套接字重定向IPv4/IPv6分别以127.0.0.1:port和tcp://[::1]:port形式把 fd 2 指向本地 TCP serverprocinfo中应出现对应地址UDP 套接字重定向用udp://127.0.0.1:port替换 fd 2procinfo显示其为 socket 且不再指向/dev/pts/不存在的文件替换到不存在的路径时命令仍报成功且文件会被实际创建因open带O_CREAT非法 fd / 非法套接字地址命令不会让调试器崩溃返回非空结果程序未启动提示 The program is not being run动态 fd 编号对use-fds测试程序先定位实际打开的 fd 号再执行替换并验证这些测试一方面印证了文件重定向、TCP/UDP 套接字重定向三类核心能力的正确性另一方面也明确了错误处理边界非法参数以参数解析错误或静默失败的方式处理而不是让调试器崩溃。小结与上手建议hijack-fd是 pwndbg 在调试会话中热替换目标进程文件描述符的实用命令用法极简hijack-fd fdnum 文件路径|套接字地址两种目标以/开头的路径视为文件否则解析为 TCP/UDPIPv4/IPv6套接字原理透明pwndbg 自动生成 shellcode 注入被调试进程借助open/socket → dup2 → close等系统调用完成替换并完整恢复寄存器与代码现场验证可靠配合procinfo可确认fd[n]的新指向。实际使用时建议先在reference-binary.native.out之类的测试程序上练习逐步验证文件重定向、IPv4/IPv6 TCP、UDP 三种典型场景再将其应用于真实的漏洞利用与逆向分析流程。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表