QEMU 로 x64, ARM 등을 커널디버깅할때 gdb 상에서 target remote IP:PORT 로 붙으면 g' packet reply is too long 이런 에러가 나는경우는 주로 QEMU 의 GDB 서버와 클라이언트 GDB 의 arch 가 서로 안맞아서 그렇다. x64 용 GDB 에서 다음과 같이 하면 된다. 참고로 x64 상에서 GDB 도 디폴트로는 32bit 로 맞춰져 있기때문에 처음에 필히 show arch 로 현재 세팅된 아키텍쳐를 확인해보아야 한다.
Start gdb
Execute "set architecture i386:x86-64:intel"
Execute "add-symbol-file linux-3.0/vmlinux"
Execute "show arch" to verify its still "i386:x86-64:intel"
Execute "target remote localhost:1234"
Execute "continue"
Press Ctrl+C, I get the above message.
이렇게 하면 Ctrl-C 로 인터럽트도 잘 걸리고 브포도 잘 걸린다. 아직 이해가 잘 안되는것이, 0x8048054 와 같은 여러 프로세스가 중첩적으로 많이 쓰는 주소에는 브포가 안걸리지만 특정한 프로세스가 혼자 매핑해서 쓰는 유저스페이스 주소에는 CPL3 인 상태에서 브포가 가능하다.
참고로 아래는 x64 QEMU 상에 gdb 서버 돌리는 옵션이 추가된 스크립트 예시...
-s 옵션과 -gdb tcp::1234 는 같은 옵션이다.
#!/bin/bash
qemu-system-x86_64 \
-m 64M \
-nographic \
-kernel bzImage \
-append 'console=ttyS0 loglevel=3 oops=panic panic=1' \
-monitor /dev/null \
-initrd rootfs.img \
-gdb tcp::1234
그런데 이런식으로 해서 gdb 에 붙어보니 레지스터, 메모리조사 및 브포는 잘 되긴하는데 si, ni 가 안된다 -_- Thread #1 이 종료되었다는 식으로 에러가 나오면서 무시된다.
warning: Remote failure reply: E22
[Thread 1] #1 stopped.
무슨 이유인지는 몰라도 브포에 멈춘상태에서 continue 를 해도 같은 에러가 나는데... 하다보니 브포에서 멈춘뒤에 브포를 지우고 다른위치에 또 브포를걸고 continue 를 하면 잘된다... 뭐 결국에 si, ni 와 같은 동작을 할수있긴 한건데... 이거 왜이런거지 ㅠㅠ
ARM 의 경우 ARM GDB 가 없어도 gdb-multiarch 를 구해서 ARM 아키텍쳐로 세팅한뒤에 비슷하게 하면된다.
(우분투에서 apt-get 으로 설치가능)
'Programming' 카테고리의 다른 글
QEMU and timer interrupt (0) | 2014.12.02 |
---|---|
Install z3 for python from source (0) | 2014.11.12 |
python distorm3 1분요약 (0) | 2014.09.30 |
CVE-2014-3153 on x86 Ubuntu 13.04 (0) | 2014.07.24 |
Mounting / Unmounting ASCII cpio archive in Linux (6) | 2014.06.25 |