커널소스코드를 수정했다거나 커널모듈, 드라이버를 개발할때 지금까지 printk 디버깅만을 해왔는데, 앞으로는 좀더 제대로 디버깅을 해야할 필요가 있을거같아서 커널 디버깅방법을 구글링해보니 VMWare 만 있으면 32비트 커널의경우 생각모다 매우 쉽고 간단하게 디버깅을 할 수 있었다. 64비트는 뭔가 잘 안된다.
1. vmx 파일에 아래처럼 3라인만 추가하면 IDA 로 remote attach 가 가능하다.
(http://s3ize.blogspot.kr/2012/08/tip-ida-vmware.html 에 잘 나와있다)
여기서 monitor.debugOnStartGuest32 의 경우 VM 시작시 디버거 attach 를 대기하라는 옵션이다. 이걸 안줘도 VM 도는중간에 attach 할수 있긴하다. 하지만 부트로더부터 디버깅을 시작하려면 이 옵션을 줘야한다. 그리고 debugStub.listen.guest32 를 64비트 커널의경우 마지막에 64로 바꿔주고 포트번호는 8864 로 접근해주면 된다. 그런데 무슨이유인지는 모르겠지만 64비트 커널은 디버깅이 뭔가 잘 안된다... 이것저것 다해봤는데 결론은 monitor.debugOnStartGuest32 에서부터 하면 IDA 가 Running 하다가 중간에 Suspend 를 하지를 못하고, VM 실행중에 attach 를 하면 디버깅이 되긴되는데 아래처럼 memory 를 전혀 볼수가 없다 (모든 메모리영역에 대해서 이렇게 된다).
F7, F8 이 잘먹히긴하는데 레지스터의 변화만 볼수있고 디스어셈블 코드나 메모리덤프를 못본다.. 원인을 모르겠다. IDA 말고 그냥 gdb target remote IP:PORT 로도 해봤는데 안된다.
2. 아무튼 위와같이 vmx 파일에 설정을 넣어주고 VM 을 실행시키면 OS 가 부팅되지 않고 Debug 대기모드상태로 가만히 있는다. 이때 IDA 로 Remote GDB attach 를 localhost:8832 로 붙어주면 된다(32비트 OS 의 경우). 64비트의 경우 포트번호가 8864 이다.
3. VM 을 돌리면 IDA 쪽에서는 Running 이라고 뜨는데, 중간에 멈추고 브포넣고싶으면 Suspend 하면된다. 그런데 브포를 걸 주소를 지금은 커널모듈같은경우 직접 함수주소 찍어주게해서 브포를 걸었는데, 바이너리만 있는것을 리버싱할경우 어떻게 해야할지 모르겠다. 일단 바이너리 자체에 0xCC 같은걸 박아넣고 해당부분이 실행되도록 해봤는데 이건 안되는것같다 --;; 인터럽트가 발생했을때 디버거로 제어가 넘어오는게 아니라 그냥 커널 핸들러로 넘어가서 죽어버리는것같다.
'Programming' 카테고리의 다른 글
Building Android QEMU from source (0) | 2014.06.19 |
---|---|
QEMU monitor console (0) | 2014.06.16 |
Python signed/unsigned 처리 (0) | 2014.06.02 |
Reverse algorithm for python binascii.crc32 (0) | 2014.06.02 |
Reverse hash("crc32") algorithm for PHP 5.5 (0) | 2014.06.02 |