원격으로 디버깅 중인 프로세스의 메모리 맵을 얻으려고 합니다(Peda 풀 요청 링크), 프로세스는 qemu-user를 사용하여 실행됩니다. 예:
qemu-arm -L /usr/arm-linux-gnueabihf/ -g 1234 ./ch47
디버깅은 gdb 명령을 사용하여 수행됩니다.
$ 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-arm의 주소 공간에서 실행됨).
확장 프로그램은 어떨지 궁금하네요비밀번호 데이터베이스원격 디버깅 및 대상이 파일 전송을 지원하지 않는 동안 메모리 맵을 검색합니까?
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]
답변1
이전처럼 전체 메모리 맵을 찾지 않고 libc의 기본 주소만 찾고 있다면 -strace
QEMU 옵션을 사용하여 결과를 읽을 수 있습니다.
다음은 qemu-mips의 예입니다:
$ 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
메모리 맵이 사용되는 용도는 표시되지 않습니다. 예를 들어, 동일한 지도의 경우:
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
그것이 어떤 파일인지는 알 수 없습니다.