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