안티리버싱을 공부하게 되면서 많은 것을 배우고 있는거 같네요..
이번에 설명할 TLS Callback 안티 디버깅 기술은 많이 쓰이고 있는지 아닌지는 잘 모르겠습니다.
하지만 가끔 안티디버깅 기술이 들어간 프로그램을 분석하려고 할 때 올디 자체가 안켜지는 경우를 겪은 적이 있어서
공부를 해보았습니다.
지금은 해당 안티디버깅 기술을 파해치는게 목적이므로 이것에 대해서만 해보았습니다. 소스코드로 구현하는 방법은 이 글을 작성하고 계속해서 공부를해서 직접 구현도 해봐야겠지요. 그냥 함수쓰는게 아니므로 쫌 공부를 해봐야겠습니다.
일단 TLS Callback 안티디버깅 기술을 설명한 사이트들을 보니 같은 프로그램을
가지고 해서 저도 그 프로그램으로 하겠습니다.
먼저 해당 프로그램을 그냥 실행시켜보았습니다.
잘 실행이 되는군요. 이제 올리디버거로 열어보겠습니다.
그냥 올디로 열었을 뿐인데 디버거가 발견되었다고 나옵니다.
우회방법만 안다면 별로 당황할건 아니지만 만약 이런 기법이 있다는 것을 모른다면 아주 황당한 창이겠지요.
해당 프로그램의 PE헤더에서 디렉토리 테이블을 보시겠습니다.
보통 PE구조에서 디렉토리 테이블은 Export Table, Import Table 이정도만 배우는데 이 프로그램은 보니 TlsTable에도 어떠한 값이 들어있습니다. 그러므로 프로그램의 Entry Point로 오기전에 실행되어지는 부분이라는 것만 알고 전 분석을 들어갔습니다.
올디에서는 콜스택 창을 제가 보질 못하는 건지 아니면 기능이 없는지 몰라서 일단은 WinDbg로 콜스택 창을 보았습니다.
당연히 프로그램이 디버거가 탐지되서 종료된 후에 말이죠 ^^;
여기서 잠깐! 아니 그냥 위에서 디버거가 탐지됬다고 창이 뜨니까 그냥 Back to user mode를 사용해서 그 부분을 찾으면 되지 않겠냐..라고 생각하시는 분들도 계실 탠데요. 당연히 위 프로그램 같은경우는 Back to user mode가 가능합니다. 하지만 ..!!
실제 TLS Callback 기능을 사용해 리버서를 괴롭히겠다고 마음 먹은 프로그램에 메시지 창을 넣을 가능성은 0.000001%도 안되기 때문입니다.
종료 됬을 때 콜스택을 봐본 것입니다.
0x0040104f가 리턴 주소로 ExitProcess 함수가 실행된 것을 볼 수 있습니다. 그러면 저 리턴 주소로 가보겠습니다.
딱 주소만 봐도 dll영역이 아니므로 왠지 찾을 수 있을 것같습니다. 다시 올디로 돌아와서 저 주소로 가보겠습니다.
하지만 여기서 중요한게 있습니다. 해당 코드는 Entry Point로 오기전에 실행되어지므로 올디에서도 설정을 바꿔주어야합니다.
보통은 Entry point of main module 로 되어있을 것입니다. 리버싱 공부할 때 책이나 문서에 전부 저렇게 설정하라고 나오니 말이죠. 하지만 System breakpoint로 바꿔주시고 해당 프로그램을 올디로 실행시켜보겠습니다.
EP가 아닌 시스템이 시작될 때로 멈춰있는 것을 볼 수 있습니다. ( WinDbg로 연 것과 같습니다. )
이제야 쫌 분석은 가능할꺼 같군요. 아까 WinDbg에서 구했던 리턴 값으로 가보겠습니다.
해당 주소로 가서 위쪽 소스코드를 보니 안티디버깅 소스코드가 보입니다. 함수로는 IsDebuggerPresent가 쓰였습니다.
아까 ExitProcess함수내부에서 리턴 주소로 오긴 했지만 ExitProcess는 그 다음 코드를 실행하지 않고 바로 프로그램이 종료되므로 RETN까지는 오지 않을 것입니다. 중요한건 아니므로 넘어가구요~
아무튼 TLS Callback이라는 안티디버깅 기술은 Entry Point오기전에 디버거를 탐지에서 프로세스를 종료시키는 기술로 우회하는 방법은 그닦 어렵지 않으니 알아두면 좋을 것같습니다.
====================================================
위에서 콜스택을 봐보시면 LdrpCallInitRoutine 함수가 사용됬습니다. 찾아보니 TLS Callback으로 등록된 코드를 실행시키는 함수라고 합니다.
간단하게 WinDbg에서 해당 함수 주소를 찾아보았습니다. 현재 빨간색 브포 걸어진 부분이 TLS Callback에 등록된 코드를 실행시키는 부분입니다. 저 브포에 여러번 걸리더군요. 바로 실행되는게 아니었습니다.
콜 하는 주소를 보니 아까 안티디버깅 코드가 있는 곳 주소입니다. 호출하고 있는거 맞군요.
이번에 설명할 TLS Callback 안티 디버깅 기술은 많이 쓰이고 있는지 아닌지는 잘 모르겠습니다.
하지만 가끔 안티디버깅 기술이 들어간 프로그램을 분석하려고 할 때 올디 자체가 안켜지는 경우를 겪은 적이 있어서
공부를 해보았습니다.
지금은 해당 안티디버깅 기술을 파해치는게 목적이므로 이것에 대해서만 해보았습니다. 소스코드로 구현하는 방법은 이 글을 작성하고 계속해서 공부를해서 직접 구현도 해봐야겠지요. 그냥 함수쓰는게 아니므로 쫌 공부를 해봐야겠습니다.
일단 TLS Callback 안티디버깅 기술을 설명한 사이트들을 보니 같은 프로그램을
가지고 해서 저도 그 프로그램으로 하겠습니다.
먼저 해당 프로그램을 그냥 실행시켜보았습니다.
잘 실행이 되는군요. 이제 올리디버거로 열어보겠습니다.
그냥 올디로 열었을 뿐인데 디버거가 발견되었다고 나옵니다.
우회방법만 안다면 별로 당황할건 아니지만 만약 이런 기법이 있다는 것을 모른다면 아주 황당한 창이겠지요.
해당 프로그램의 PE헤더에서 디렉토리 테이블을 보시겠습니다.
보통 PE구조에서 디렉토리 테이블은 Export Table, Import Table 이정도만 배우는데 이 프로그램은 보니 TlsTable에도 어떠한 값이 들어있습니다. 그러므로 프로그램의 Entry Point로 오기전에 실행되어지는 부분이라는 것만 알고 전 분석을 들어갔습니다.
올디에서는 콜스택 창을 제가 보질 못하는 건지 아니면 기능이 없는지 몰라서 일단은 WinDbg로 콜스택 창을 보았습니다.
당연히 프로그램이 디버거가 탐지되서 종료된 후에 말이죠 ^^;
여기서 잠깐! 아니 그냥 위에서 디버거가 탐지됬다고 창이 뜨니까 그냥 Back to user mode를 사용해서 그 부분을 찾으면 되지 않겠냐..라고 생각하시는 분들도 계실 탠데요. 당연히 위 프로그램 같은경우는 Back to user mode가 가능합니다. 하지만 ..!!
실제 TLS Callback 기능을 사용해 리버서를 괴롭히겠다고 마음 먹은 프로그램에 메시지 창을 넣을 가능성은 0.000001%도 안되기 때문입니다.
종료 됬을 때 콜스택을 봐본 것입니다.
0x0040104f가 리턴 주소로 ExitProcess 함수가 실행된 것을 볼 수 있습니다. 그러면 저 리턴 주소로 가보겠습니다.
딱 주소만 봐도 dll영역이 아니므로 왠지 찾을 수 있을 것같습니다. 다시 올디로 돌아와서 저 주소로 가보겠습니다.
하지만 여기서 중요한게 있습니다. 해당 코드는 Entry Point로 오기전에 실행되어지므로 올디에서도 설정을 바꿔주어야합니다.
보통은 Entry point of main module 로 되어있을 것입니다. 리버싱 공부할 때 책이나 문서에 전부 저렇게 설정하라고 나오니 말이죠. 하지만 System breakpoint로 바꿔주시고 해당 프로그램을 올디로 실행시켜보겠습니다.
EP가 아닌 시스템이 시작될 때로 멈춰있는 것을 볼 수 있습니다. ( WinDbg로 연 것과 같습니다. )
이제야 쫌 분석은 가능할꺼 같군요. 아까 WinDbg에서 구했던 리턴 값으로 가보겠습니다.
해당 주소로 가서 위쪽 소스코드를 보니 안티디버깅 소스코드가 보입니다. 함수로는 IsDebuggerPresent가 쓰였습니다.
아까 ExitProcess함수내부에서 리턴 주소로 오긴 했지만 ExitProcess는 그 다음 코드를 실행하지 않고 바로 프로그램이 종료되므로 RETN까지는 오지 않을 것입니다. 중요한건 아니므로 넘어가구요~
아무튼 TLS Callback이라는 안티디버깅 기술은 Entry Point오기전에 디버거를 탐지에서 프로세스를 종료시키는 기술로 우회하는 방법은 그닦 어렵지 않으니 알아두면 좋을 것같습니다.
====================================================
위에서 콜스택을 봐보시면 LdrpCallInitRoutine 함수가 사용됬습니다. 찾아보니 TLS Callback으로 등록된 코드를 실행시키는 함수라고 합니다.
간단하게 WinDbg에서 해당 함수 주소를 찾아보았습니다. 현재 빨간색 브포 걸어진 부분이 TLS Callback에 등록된 코드를 실행시키는 부분입니다. 저 브포에 여러번 걸리더군요. 바로 실행되는게 아니었습니다.
콜 하는 주소를 보니 아까 안티디버깅 코드가 있는 곳 주소입니다. 호출하고 있는거 맞군요.
'My Study > Reversing' 카테고리의 다른 글
DLL Injection (7) | 2010.04.12 |
---|---|
Anti Debuggering 우회 Plugin (0) | 2010.04.09 |
IDA v5.2 동 네트워크 대역에서 동시 사용 (0) | 2010.03.13 |
커널모드에서 유저모드 디버깅 (0) | 2010.03.11 |
Vmware를 사용한 커널 디버깅 (2) | 2010.03.11 |