본문 바로가기

Programming

IDA/gdb Debugging After Attaching

IDA/GDB 등으로 프로세스를 attach 시켰을때 특별히 참조할 만한 지점이 없을때 마지막 실행흐름을 따라가는 방법으로는 Stack Frame Trace 기능을 이용하면 된다. 먼저 GDB 의 경우 다음과 같다. ps aux 로 원하는 프로세스의 PID 를 얻고 -p 옵션으로 attach 시킨다.


root@ubuntu:/home/meltdown# gdb -p 7918


...


0xb7764424 in __kernel_vsyscall ()

(gdb) x/10i $eip

=> 0xb7764424 <__kernel_vsyscall+16>: pop    %ebp

   0xb7764425 <__kernel_vsyscall+17>: pop    %edx

   0xb7764426 <__kernel_vsyscall+18>: pop    %ecx

   0xb7764427 <__kernel_vsyscall+19>: ret    

   0xb7764428: add    %ch,(%esi)

   0xb776442a: jae    0xb7764494

   0xb776442c: jae    0xb77644a2

   0xb776442e: jb     0xb77644a4

   0xb7764430: popa   

   0xb7764431: bound  %eax,(%eax)

(gdb) up

#1  0xb7655750 in nanosleep () from /lib/i386-linux-gnu/libc.so.6

(gdb) x/10i $eip

=> 0xb7655750 <nanosleep+32>: mov    %edx,%ebx

   0xb7655752 <nanosleep+34>: cmp    $0xfffff001,%eax

   0xb7655757 <nanosleep+39>: jae    0xb7655789 <nanosleep+89>

   0xb7655759 <nanosleep+41>: ret    

   0xb765575a <nanosleep+42>: call   0xb769ad20

   0xb765575f <nanosleep+47>: push   %eax

   0xb7655760 <nanosleep+48>: mov    %ebx,%edx

   0xb7655762 <nanosleep+50>: mov    0xc(%esp),%ecx

   0xb7655766 <nanosleep+54>: mov    0x8(%esp),%ebx

   0xb765576a <nanosleep+58>: mov    $0xa2,%eax

(gdb) up

#2  0xb7655573 in sleep () from /lib/i386-linux-gnu/libc.so.6

(gdb) x/10i $eip

=> 0xb7655573 <sleep+275>: test   %eax,%eax

   0xb7655575 <sleep+277>: mov    %eax,%edi

   0xb7655577 <sleep+279>: je     0xb7655498 <sleep+56>

   0xb765557d <sleep+285>: test   %edi,%edi

   0xb765557f <sleep+287>: jne    0xb7655590 <sleep+304>

   0xb7655581 <sleep+289>: xor    %eax,%eax

   0xb7655583 <sleep+291>: add    $0x1cc,%esp

   0xb7655589 <sleep+297>: pop    %ebx

   0xb765558a <sleep+298>: pop    %esi

   0xb765558b <sleep+299>: pop    %edi

(gdb) up

#3  0x0804846d in main ()

(gdb) x/10i $eip

=> 0x804846d <main+33>: jmp    0x8048455 <main+9>



VDSO 의 __kernel_vsyscall() 에서 멈추게 되는데, 이때 up 명령과 print $eip 명령을 통해 스택프레임을

조사하고, 원하는 지점을 찾아서 브포를 걸면된다.


IDA 의 경우는 attach 하는경우 추가적인 쓰레드가 생성되서 멈추게 되는데, 먼저 오른쪽의 쓰레드 정보창에서 원하는 main 쓰레드를 선택한 뒤에 Ctrl+Alt+S 또는 메뉴에 Stack Trace Window 를 열면 함수 스택 트레이스 정보를 얻을 수 있다.


1. attach 한뒤에 다음과같이 ntdll.dll 의 새로운쓰레드에서 멈춤



2. Thread 목록에서 브포걸기 원하는 메인쓰레드를 선택


3. 메인쓰레드에서 콜스택 조사


4. 콜스택상에서 라이브러리가 아닌 베이스모듈상의 최상위 리턴지점에 브포를 걸고 IDA 실행.


성공적으로 브레이크포인트가 잡힌다.

'Programming' 카테고리의 다른 글

Intel PIN Tutorial  (1) 2014.03.06
Linux gdb ASLR disabling  (0) 2014.03.04
Building KVM from source in Ubuntu  (1) 2014.02.13
Linux Kernel compile and update  (0) 2014.01.07
QEMU Internals  (0) 2014.01.02