totekuh/kpoke

GitHub: totekuh/kpoke

轻量级嵌入式 MIPS Linux 内核内存检查工具,在无依赖、资源受限的 IoT 环境中实现内核级读写和调试。

Stars: 0 | Forks: 0

# kpoke 嵌入式 MIPS Linux 的内核内存检查工具。零依赖 —— 使用原始系统调用,无 libc,静态二进制文件小于 12KB。 专为路由器和 IoT 设备构建,适用于没有工具链、没有 gdb、没有 `/proc/slabinfo` 且文件系统为只读 squashfs 的环境。上传,运行,即可探测内核。 ![kpoked](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/6707fba979000413.png) ## 两个二进制文件 | Binary | Size | Description | |--------|------|-------------| | `kpoke` | ~10KB | 独立 CLI —— 每次调用执行一条命令 | | `kpoked` | ~12KB | TCP 守护进程 —— 通过网络进行交互式会话 | ## 命令 ``` read [count] Read dwords from kernel memory walk [max] Walk circular doubly-linked list (Linux list_head) slab Pretty-print struct kmem_cache (SLAB allocator) pages Dump all slab objects with 2-dword fingerprints write [count] Write dword(s) to kernel memory flush Flush I+D cache (required after writing code) ``` 所有地址接受 kseg0 (`0x8xxxxxxx`) 并自动转换为物理地址以供 `/dev/mem` 使用。如果 `/dev/mem` 不可用,会创建 `/var/tmp/devmem` 作为字符设备。 ## 构建 ``` make # build kpoke with dockcross (docker required) make daemon # build kpoked (TCP daemon) make local # build kpoke with local mipsel-linux-gnu-gcc make strip # build + strip symbols make help # show all targets ``` 首次使用?运行 `make setup` 拉取 dockcross 镜像,或运行 `make setup-local` 安装 apt 交叉编译器。 ## 用法 将二进制文件上传到 MIPS32 LE 目标机并在其上运行。 ### 独立 CLI ``` kpoke read 0x83dbe400 16 kpoke walk 0x80344a44 0x44 kpoke slab 0x83fb5e00 kpoke pages 0x83fb5e00 kpoke write 0x83dbe40c 0xdeadbeef kpoke flush 0x83dbe400 256 ``` ### TCP 守护进程 ``` # 在目标上: kpoked 4446 & # 从网络上的任何机器: $ nc 192.168.240.1 4446 read 0x80000000 4 0x80000000: 0x3c1b8035 0x80000004: 0x401a4000 0x80000008: 0x8f7be000 0x8000000c: 0x001ad582 slab 0x83c809c0 name: bridge_fdb_cache buffer_size: 00000020 (32) ... walk 0x80371258 0x44 3 #0: 0x83c809c0 #1: 0x83c80a20 #2: 0x83c80a80 total: 3 ``` 每次连接支持多条命令。可交互或脚本化: ``` printf "read 0x80000000 4\nslab 0x83c809c0\n" | nc -w 2 192.168.240.1 4446 ``` ## 工作原理 - 使用 MIPS32 LE 汇编编写,通过原始 Linux 系统调用运行 - 通过 `/dev/mem` 访问内核内存(如果真实的 `/dev/mem` 不可用,则在 `/var/tmp/devmem` 创建字符设备) - 自动将 kseg0 虚拟地址转换为物理地址 - 理解 Linux 2.6.x SLAB 分配器结构体(`kmem_cache`、`kmem_list3`、`slab`) - `kpoked` 为每个连接 fork,将 socket dup2() 到 stdout,逐行读取命令 - 无 libc,无动态链接器,无依赖 —— 仅纯静态 ELF ## 目标平台 MIPS32 小端模式(MediaTek MT7628、MT7621 等)。Linux 2.6.36+。 `slab` 和 `pages` 命令需要带有 `NR_CPUS=1` 的 SLAB 分配器(结构体偏移量已硬编码)。所有其他命令(`read`、`write`、`walk`、`flush`)可在任何带有 `/dev/mem` 的 Linux 内核上运行。 ## 许可证 MIT
标签:/dev/mem, IoT安全, kmem_cache, Linux内核, MIPS架构, Raw Syscall, TCP守护进程, Web报告查看器, 云资产清单, 内存检查, 内存读写, 内核SLAB, 内核调试, 固件分析, 安全报告生成, 嵌入式安全, 无Libc, 漏洞分析, 裸机编程, 路径探测, 路由器安全, 轻量级工具, 逆向工程, 静态编译