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
IDA/gdb Debugging After Attaching  (0) 2014.03.03
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
Posted by daehee87

댓글을 달아 주세요