여러 자료를 복합해 독학하며 적어본 내용입니다.
혹시 저작권상의 문제가 있다면 바로 조치 하겠습니다 감사합니다
리버싱 공부를 해보며, IDA실습에 대해 어느 정도 필요성을 느끼게 되었다
그래서 IDA공부를 해보고자 했는데
사실 리버싱 만으로 IDA를 바로 입문하기에는 쉽지 않더라
그래서, 악성코드를 시작으로 IDA를 입문해보기로 하였다!
악성코드의 경우는 IDA실습이 꽤나 잘되어 있기 때문에...!
Practical Malware Analysis를 통해 진행해보기로 하였고,
우리는 사실 악성코드 자체 분석이 목표는 아니므로....
사용법을 익히는 것과 조작키, 읽는 방식 등을 알아보기로 하였다.
내가 분석하게 된 파일은
이 책에서 제공해주는 실습파일이다.
사실 이미 외국버전으로 유명한 책이라
실습파일은 많이 돌아다니더라
shinmao/Practical-Malware-Analysis
The LAB practices of Practical Malware Analysis. Contribute to shinmao/Practical-Malware-Analysis development by creating an account on GitHub.
github.com
나는 여기서 다운받아
5-1 dll파일을 분석해보기로 하였다
첫화면은 이러하다
1. 이 파일의 DllMain 주소를 구하시오
Main주소의 종류에는 크게
WinMain, Main, tmain 이런 것들이 있다
우리가 찾고자 하는
DllMain은 dll의 main 함수인데,
주로 메인 함수 dll이 로드될 때 사용된다
Main함수의 4가지 정의
→ dll이 로드될 시, 언로드될 시, dll이 attach될 시
스페이스바 누르면 자세히 볼 수 있음
Names 창에 가면 원하는 함수들에 대한 검색이 가능한데, dlMain으로도 갈 수 있다.
(Names라는게, 이전 버전에서는 가능했는데 지금 내가 사용하는 버전에는 없다)
그래서 왼쪽 창에 function 창이 있는데, 거기서 dll을 검색하면(그냥 dll을 쳐주면 된다)
DLLEntryPoint라는 것이 검색된다
여기로 가보기로 한다
그러면 이부분이 나오고,
Dll EntryPoint라는 것이 검색이 되는데,
이 지점의 주소가 DllMain주소이다
1001516D이다
2. Imports 윈도우를 이용해 gethostbyname을 탐색해보자. 임포트 위치는 어디인가?
이제 Imports창으로 넘어가 보자.
그러면 주소가 좌르륵 뜨게 되는데
아까 했던 것처럼 우리가 찾고자 하는 gethostbyname을 그냥 검색해주면
바로 원하는 부분이 출력되게 된다
왼쪽의 주소 부분을 좀 늘려서,
주소를 확인해주면 우리가 찾는 임포트 위치가 나오게 된다
0100163CC이다
3. gethostbyname을 호출하는 CALL명령어는 몇 개인가?
앞서 impot에서 검색한 함수 더블 클릭해서 들어오면,
이렇게 뜨게 되는데,
XREF를 주목해서볼 필요가 있다
XREF는 말그래도 이 부분을 참조한 녀석들을 확인할 수 있는 부분이다.
이 부분을 오른쪽 버튼을 통해 List Cross References to 를 눌러주면
이 gethostbyname을 참조한 주소들을 조회해볼 수 있다
가장 아래에 뜨는 숫자는 18인것을 알 수 있다 (총 18개의 함수가 이 gethostbyname을 이용했다는 것)
여기서 p는 호출을, r은 읽는 부분이다
sub_10001074, sub_10001365, sub_10001656, sub_1000208F, sub_10002CCE
이렇게 총 5개의 함수에서 9번의 호출을 한 것을 알 수 있다
또한, p가 9개이므로 9번의 함수 호출이 발생한 것을 알 수 있다
4. 0x10001757에 위치한 gethostbyname 호출을 보면 어떤 DNS요청이 이뤄지는지 알 수 있는가?
이 문제를 풀려면, gethostbyname가 어떤 역할을 하는지부터 알아야 한다.
gethostbyname은 이름을 넣어주면, host database로부터
hostname을 받아오는 친구라는 것을 알 수 있다
그래서, gethostbyname의 인자인 name을 보면 어떤 요청이 이루어지는 지를 알 수 있다.
아까 처음의 IDA View-A창으로 돌아간 후, 여기서 G를 눌러주자
(Ctrl+G가 아니다)
그러면, 이런 창이 뜨는데 우리가 원하는 010001757을 넣어주면 된다
그러면 바로 gethostbyname이 뜨고 위에 name이 동시에 전달되는 것을 볼 수 있다.
보통 악성코드에 있는 name의 경우는 string으로 바로 받아오지 않고
eax로 한번 걸쳐서 받아오게 된다.
조금 더 위쪽에 보면, off_10019040이 있는데 여기에 마우스를 올려 놓으면
[This is RDO]pics.praticalmalwareanalysis.com 하는 내용이 포함되어 있다
아래에서 0Dh는 13이므로 뒤의 13자리인 pics.praticalmalwareanalysis.com을
전달하는 것을 알 수 있다
+)EAX는 어디로부터 왔는가?
eax는 10019040이라는 주소의 데이터를 가져오고
eax에 0Dh를 더하는 것을 알 수 있음
G를 통해 다시 10019040을 하여
이렇게HexViewA 창으로 가면, 그 데이터가 Hex값으로 나온다.
리틀엔디언 방식으로 거꾸로 적혀있다.
이를 읽으면, 0X10019194인데 이 데이터를 가져와서 0Dh를 더하는 것이다
계산한 결과 1001 91A1이다
이를 바탕으로, G를 누르고 100191A1하면
이 부분으로 점프한 것을 알 수 있다
아까의 위에 부분에서 0Dh만큼을 점프한 것이다
A0이 5D자리부터이므로 A1은 70부터임을 알 수 있다
이것을 name으로 넘기는 것이다
5.0x10001656에 있는 서브루틴에서 IDA Pro는 지역변수 몇 개를 인지하고 있는가?
6. 0x10001656에 있는 서브루틴에서 IDA Pro는 파라미터 몇 개를 인지하고 있는가?
두 문제 모두 같이 풀 수 있어서 한꺼번에 해보도록 하겠다
G를 누르고 10001656으로 가고 IDA View를 가서 그래프 모드로 전환해보자
여기서 -의 의미는 지역변수이고 마지막 +(양수)의 의미는 파라미터일 가능성이 높다
따라서 갯수를 모두 세주면 지역변수는 총 23개, 마지막으로 파라미터는 1개이다
8. Strings 윈도우를 이용해 디스어셈블리 내의 문자열 \cmd.exe /c를 찾아보자. 어디에 있는가?
그러면, \cmd.exe/c를 찾아보면 된다.
Shift+F12로 Text를 검색하는 창에서, \cmd.exe/c를 검색해주면 된다.
이를 통해, 우리는 \cmd.exe/c가 10095B34에 위치한 것을 알 수 있다
9. \cmd.exe /c를 참조하는 코드 영역에서 무슨 일이 발생하는가?
이를 대답하려면, 또 \cmd.exe/c가 무슨 역할을 하는지 알 필요가 있다.
cmd.exe/c notepad.exe나 notepad.exe나 둘다 똑같이 메모장을 실행하는 것은 맞다
그렇지만, cmd창에서 \cmd.exe/c notepad.exe를 하면 이게 종료될 때까지 cmd를 클릭해도 반응이 없다
(마우스가 안먹는다는 뜻)
조금 아랫쪽에 이러한 문구도 볼 수 있으며,
XREF를 통해 한부분만이 참고되고 있는 것을 알 수 있다
클릭하여 그래프 모드로 넘어가면 GetSystemDirectoryA를 통해 어디로 가야하는지 고민하는 지점을 볼 수 있다
전체적으로 보면, 그래프는 전반적으로 계단식이다.
이코드 영역에서는 공격자의 실행명령어를 실행하기 위한 세팅작업이 일어난다.
9. 같은영역 0x100101C8에서 dword_1008E5C4는 경로를 지정하는 전역변수로 보인다, 악성코드는 어떻게 dword_1008E5C4를 설정하는가?(힌트:dword_1008E5C4의 상호참조를 활용하라)
이번에는 0100101C8로 점프해주자
이 부분을 더블 클릭하여 XREF참조를 해주면
Type에 따라 write, read 등이 있는것을 알 수 있다
Setting은 write를 하기 때문에 w를 향해 이동해주면
dword_10008E5C4와 sub_10003695를 동시에 확인할 수 있다
또한, dword_10008E5C4를 클릭하면
여기서 우리는 10003695의 결과인 eax를 통해 데이터를 받아오는 것을 확인할 수 있다.
이 지점 안으로 들어가주면,
GetVersopmExA함수를 호출하는 것을 통해서 커널 버전을 참고하는 것을 알 수 있다