首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qemu-user :远程调试时获取内存映射

Qemu-user :远程调试时获取内存映射
EN

Unix & Linux用户
提问于 2019-02-10 10:06:47
回答 1查看 2K关注 0票数 1

我正在尝试获取我正在远程调试的进程(peda请求链路)的内存映射,该进程使用qemu-user运行,例如:

代码语言:javascript
复制
qemu-arm -L /usr/arm-linux-gnueabihf/ -g 1234 ./ch47

调试是用gdb完成的,命令:

代码语言:javascript
复制
$ gdb-multiarch --nx -q ch47

(gdb) target remote localhost:1234

Remote debugging using localhost:1234
warning: remote target does not support file transfer, attempting to access files from local filesystem.
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.

(gdb) info inferiors 
  Num  Description       Executable        
* 1    Remote target     /home/redouane/infosec/arm_uaf/ch47 

(gdb) remote get /proc/self/maps /tmp/map
Remote I/O error: Fonction non implantée

如我所见,调试的进程没有PID (它运行在qemu的地址空间,而不是单独的进程)。

我想知道,像pwndbg这样的扩展如何在远程调试时检索内存映射,而目标不支持文件传输?

代码语言:javascript
复制
pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
   0x10000    0x13000 r-xp     3000 0      /home/redouane/infosec/arm_uaf/ch47
   0x13000    0x22000 ---p     f000 2000   /home/redouane/infosec/arm_uaf/ch47
   0x22000    0x23000 r--p     1000 2000   /home/redouane/infosec/arm_uaf/ch47
   0x23000    0x24000 rw-p     1000 3000   /home/redouane/infosec/arm_uaf/ch47
0xff7c5000 0xff7dd000 r-xp    18000 0      [linker]
0xff7dd000 0xff7ed000 ---p    10000 18000  [linker]
0xff7ed000 0xff7ee000 r--p     1000 18000  [linker]
0xff7ee000 0xff7ef000 rw-p     1000 19000  [linker]
0xfffee000 0xffff0000 rw-p     2000 0      [stack]
EN

回答 1

Unix & Linux用户

发布于 2022-05-05 10:35:37

如果您不是在寻找整个内存映射,而是像我以前那样只查找libc的基本入口,您可以使用QEMU的-strace选项,然后读取结果。

下面是qemu的一个示例:

代码语言:javascript
复制
$ qemu-mips -noaslr -nx -strace ./test
...
25631 openat(AT_FDCWD,"/lib/libc.so.6",O_RDONLY|O_CLOEXEC) = 3
25631 read(3,0x7ffff4ac,512) = 512
25631 prctl(46,13,2147480748,512,1928908800,0) = -1 errno=22 (Invalid argument)
25631 _llseek(3,0,520,0x7ffff250,SEEK_SET) = 0
25631 read(3,0x7ffff280,36) = 36
25631 _llseek(3,0,828,0x7ffff228,SEEK_SET) = 0
25631 read(3,0x7ffff258,32) = 32
25631 fstat64(3,0x7ffff360) = 0
25631 mmap2(NULL,1638448,PROT_EXEC|PROT_READ,MAP_PRIVATE|MAP_DENYWRITE,3,0) = 0x7f655000
...

在这里,您可以看到libc在成功定位和加载后的基本地址是0x7f655000

对于更完整的内存映射,您可以使用-mmap选项,但它不会显示内存映射的用途。例如,对于同一张地图:

代码语言:javascript
复制
mmap: start=0x00000000 len=0x00190030 prot=r-x flags=MAP_PRIVATE fd=3 offset=00000000
ret=0x7f655000
start    end      size     prot
00400000-00401000 00001000 r-x
00410000-00412000 00002000 rw-
6ae9c000-6aec0000 00024000 r-x
6aec0000-6aecf000 0000f000 ---
6aecf000-6aed1000 00002000 rw-
7f655000-7f7e6000 00191000 r-x
7f7e6000-7f7fd000 00017000 r--
7f7fd000-7f7ff000 00002000 rw-
7f7ff000-7f800000 00001000 ---
7f800000-00000000 80800000 rw-

在这里,您可以看到提供给mmap2 ()的文件描述符是3,但是您不知道它是什么文件。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/499752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档