OutDoorFrog의 리버싱 이야기

Anti Reversing Techniques Report [수정중] 본문

공부

Anti Reversing Techniques Report [수정중]

OutDoorFrog 2018. 10. 23. 13:55




ANTI - Reversing Techniques Report (Zer0day)


개구리에 대한 이미지 검색결과



0. 개요






18회 해킹캠프에 참가했을 때 CTF 문제는 어떻게 나올지 궁금했습니다.

(그 때 CTF에 참여한 경험이 딱 한 번 밖에 없었거든요)


그래서 1시간 전에 구글링을 하면서 CTF 준비를 하고 있는 도중

(혹시 모르잖아요.. 유사 유형 문제가 하나 정도 나와줄 수도 있을 수도??) 


ChickenMe 문제를 접했습니다.


호기심에 30분 동안 도전해봤지만 난이도가 너무 높더군요.


충격짤에 대한 이미지 검색결과


"이런 리버싱 문제가 CTF에서 날뛰고 다닌단 말이야?"라고 경악을 하면서


그 때의 저로써는 패닉 상태에 빠졌는데 지금이라면 도전할 수 있을 것 같습니다!


하여튼 안티 리버싱에 관한 PDF를 보며 안티 리버싱에 대해 예방 접종을 합시다!

(문제에 사용된 개념을 알고 있으면 그나마 문제를 풀기 수월합니다.)



1. 안티 리버싱, 사용 목적은?






안티 리버싱이란 프로그램 분석을 어렵게 만드는 기술 중 하나입니다.


예를 들자면 코드 난독화, 디버깅 탐지 같은 기능이 이런 기술에 해당합니다.


이런 기술들은 상용 게임, 영상, 및 노래, 악성 코드에서 사용되고


요즘은.. 분석가의 실력, 도구가 워낙 좋아져서 "분석을 지연하는 목적"으로 사용합니다.


.

.

.


함정카드에 대한 이미지 검색결과


라고 PDF에 나와있습니다.(간단 요약)



제 짧은 CTF 참여 경험을 통해 알아낸 안티 리버싱 기술의 사용 목적은..


"CTF 플레이어의 멘탈 폭파"인 듯 싶습니다.

(특히 안티 리버싱 개념, 기술을 모르는 사람에게는 특효)


저 같이 리버싱 문제만 골라먹으려는 사람에게는 저런 기술은 멘탈 폭파에 특효약이죠.

(근데 이런 것도 안 통하는 사람들이 있어요)


멘붕에 대한 이미지 검색결과


해캠 이후로 안티 리버싱 기술이 몇 사용된 문제를 만들어서 제 지인에게 드렸는데


분석하기 힘들어하는 모습을 보니까 기분이 좋았습니다.


언젠가 해킹 캠프 같은 큰 행사에서 사용되는 문제도 만들어보고 싶네요!




2. 따라해보자.



PDF에서는 이러한 기법들을 소개하고 있습니다.




Anti-Debugging


  1.  Based on API Calls

  2.  Based on Windows Internals

  3.  Based on Exception

  4.  Based on Break Points

  5.  Based on Flags

  6.  Based on VM Detection

  7.  Based on Timing

  8.  Based on Checksums


Anti-Disassembly


  1.  Code Obfuscating

  2.  Packing

  3.  Anti Dumping




멘붕에 대한 이미지 검색결과


문제에 이런 기술들이 도배가 되어 있다면 최소 리버서 한 명은 골로 보내겠군요.


2.1 Based API Calls



A) CheckRemoteDebuggerPresent





형식 : CheckRemoteDebuggerPresent(HANDLE hProcess, PBOOL pbDebuggerPresent)







인자값 설명 : 


 hProcess : 프로세스 자신의 핸들을 GetCurrentProcess로 구하시면 됩니다.

 pbDebuggerPresent : 함수의 결과를 저장해줄 변수입니다.



함수 설명 :


 IsDebuggerPresent 함수와 사용법이 같다고 생각하시면 됩니다.

 True를 반환하면 디버깅이 탐지된 것이고 False를 반환하면 디버깅이 탐지되지 않은 것입니다.




 유사한만큼 우회하는 방법도 비슷할까요?



IsDebuggerPresent 함수를 이용한 소스 코드



제가 리버싱 재활 치료 중인 관계로 MessageBoxA 함수를 호출했습니다.
(실험하는 함수 이름으로 파일 이름을 네이밍하지 마세요. 셀프 안티 리버싱입니다.) 



IDA를 이용해서 디스어셈블된 코드도 한 번 보도록합시다.



IDA











우회


빨간색 부분 cmp var_8, 1 로 패치해서 저장하면 간단히 우회가 됩니다.

파란색 부분을 호출 이후 EAX 레지스터의 값을 0으로 바꿔도 마찬가지 입니다.




아마 CheckRemoteDebuggerPresent 함수도 마찬가지 일겁니다.



CheckRemoteDebuggerPresent 소스 코드




IDA











리버싱할 때


IsDebuggerPresent 함수에서의 우회법을 적용해봅시다.





IF문에서 var_8과 0을 비교하니까 값을 패치합시다.




0으로 패치한 후 살펴보면..




우회가 되는 군요.


(함수 호출 직후 EAX 레지스터의 값을 0으로 바꾸는 우회법도 마찬가지)


B) FindWindow






형식 : FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName)



인자값 설명 : 


lpClassName : 찾고자 하는 윈도우 클래스 이름을 넣으시면 됩니다.


lpWindowName : 정해진 캡션 이름이 있는 것도 아니니까, NULL 값 넣으시면 됩니다.


함수 설명 : 



Q : 아니 이 함수가 안티 디버깅에 사용된다고요???


깜놀에 대한 이미지 검색결과



A : 디버거(GUI)도 윈도우가 있으니까 됩니다.



lpClassName 인자에 찾고자하는 윈도우의 이름을 넣어주면 그 이름을 가진 윈도우의 핸들을 

반환합니다.


반환값이 NULL이면 원하는 윈도우를 찾지 못한 것이고, NULL이 아니면 찾은 것입니다.



솔직히 FindWindow 함수가 이런 사용법이 있을 줄 몰랐습니다..

(문제를 낼 때는 사용하기 힘들겠지만..)



FindWindow 함수를 이용한 소스 코드



문제로 만든다면 이런 흐름으로 갈듯 싶습니다.


저 같은 경우 다양한 디버거의 이름을 일일히 다 외우기는 힘듭니다.


제가 출제자라면 사용하지 않을 것 같습니다.



IDA











IsDebuggerPresent 함수처럼 판단 부분에서 패치를 이용해서 우회할 수 있고


디스어셈블된 코드에서 서술되지 않은 디버거를 사용해도 쉽게 우회가 가능할 듯 싶습니다.



C) OpenProcess




형식 : OpenProcess( DWORD dwDesiredAccess, BOOL bInheritHandle, 

DWORD dwProcessID )




인자값 설명 : 


dwDesiredAccess : 프로세스에 어떤 권한으로 접근하는지 넣으시면 됩니다.


프로세스 접근 매크로 확인하기(참고용)


bInheritHandle : 접근한 프로세스를 현재 프로세스에 상속 여부를 서술하면 됩니다.


dwProcessID : 접근하고싶은 프로세스의 PID를 서술하면 됩니다.



반환값 :


성공했을 때 NULL이 아닌 값을 반환합니다.


함수 설명 :


프로세스의 핸들을 얻어오는 함수입니다.


해당 안티 디버깅 기법은 OpenProcess함수로 csrss.exePROCESS_ALL_ACCESS 권한으로 실행해서 디버깅 중인지를 판단하는 기법입니다.


일반적인 실행일 때는 PROCESS_ALL_ACCESS 권한으로 실행할 수 없지만 

디버깅 할 때는 이미 해당 권한을 사용해서 프로세스를 attach하거나 open하기
때문에 성공적으로 PROCESS_ALL_ACCESS 권한으로 열 수 있습니다.



DGMONG LAB님의 블로그
(SeDebugPrivilege 와 Open Process를 이용한 안티 디버깅 기법의 설명이 잘 되어 있습니다.)



csrss.exe 프로세스를 건들여서 판단이 가능하다니.. 신기하네요.ㄷㄷ



OpenProcess 함수를 이용한 소스 코드



CsrGetProcessId를 이용해서 csrss.exe 프로세스의 PID를 얻은 후


Process_All_Access 권한으로 OpenProcess를 이용해 프로세스에 접근해서

접근의 성공 여부에 따라 디버깅 판단하는 코드인듯 싶습니다.



탐지당해봅시다.



Ollydbg는 SeDebugPrivilege 토큰을 디버깅된 프로세스에 상속해줍니다.

(x32dbg는 관리자로 실행해도 안되더라구요..)


탐지당하려면 OllyDBG를 관리자 권한으로 실행시켜 디버깅하면됩니다.


삽질에 대한 이미지 검색결과


실제로 비교해볼까요?





Windows 10, 64bit, x32dbg)



csrss.exe말고 프로세스 자신에게 OpenProcess 함수를 써도 안티 디버깅이 될 것 같습니다. 


이런 특수한 부분까지 연구해서 자신만의 문제를 만들어내도 좋을 듯 싶습니다.



Windows 7, 32bit, ollydbg)



관리자 권한으로 실행한 후 디버깅을 해보니 탐지가 됩니다.


지금까지 실험해본 디버거 중 Ollydbg랑 Windbg만 적용이 되는군요.


IDA 같은 디컴파일러에 대처할려면 ANTI Hex-Ray도 연구해봐야겠네요.



(수정 중입니다^^ 이터널 부분도 해보고 있는데 재밌네요.)



Zer0day 님 블로그 바로가기

'공부' 카테고리의 다른 글

010-editor 크랙을 만들어보자.  (1) 2019.01.18
Comments