티스토리 뷰
main 함수를 찾는건 기본이지만, main 함수 시작 전 stub code의 형태 좀 정리해서 기초 좀 정리하자는 의미에서 시작한다. 아무리 큰 프로그램이여도 main 함수 시작 전에 stub 코드를 통해 실행되기 때문에 이를 볼 줄 알면 더욱 수월하다.
실제 응용 프로그램의 코드에서 main 함수를 찾아보고자 한다. 하지만 심볼이 날아가 있어 바로 보이지는 않으므로, 약간은 분석해서 찾아보고자 한다.
※ 심볼이란? https://blogs.msdn.microsoft.com/noenemy/2009/08/05/symbol-file/
분석 전
먼저 IDA로 열어준 후, function name 창에서 검색(Ctrl+F)를 눌러 start를 입력하여, start 함수로 진입한다. 만약 start 함수가 없다면, mainCRTStartup과 같은 함수가 존재할텐데 진입하여 분석하면 되고, 그 결과는 아래의 화면과 비슷하게 나올 것이다.
프로그램의 진짜 시작이 되는 start 함수에는 총 2개의 함수가 있다.(Case 1)
- _security_init_cookie() : Program에서 Stack Overflow 보안을 위해 설치할 Stack Cookie 값을 초기화하는 함수
- __mainCRTStatup() : main 함수로 이어지는 stub code 함수
mainCRTStartup 함수로 시작하는 경우는 함수가 달라진다.(Case 2)
- _security_init_cookie() : Program에서 Stack Overflow 보안을 위해 설치할 Stack Cookie 값을 초기화하는 함수
- _scrt_common_main_seh() : main 함수로 이어지는 stub code를 가지고 있는 함수, 내부가 좀 다르다.
CRT(C Runtime Library, https://msdn.microsoft.com/ko-kr/library/abx4dbyh.aspx)가 나오는데, Visual Studio는 비표준 C언어를 사용하긴 해도 표준 C언어를 일부 제공한다. 이러한 표준 C언어 함수를 제공하려면 라이브러리가 필요한데, 그게 CRT이다.
__security_init_cookie() 함수
__security_init_cookie() 함수는 System 시간과 현재 ThreadID, ProcessID를 토대로 Stack Cookie 값을 생성하는 함수이다.
main 함수를 찾는 것과는 관련이 없고, 정적 분석으로는 Stack Cookie 값이 뭔지 알기 힘들다.
mainCRTStartup() 함수(Case 1)
mainCRTStartup(또는 _srct_common_main_seh) 함수 내부에서 main 함수가 실행된다. mainCRTStartup 함수는 프로그램 실행을 위해 각종 설정을 한 후, main 함수를 실행하도록 이어진다.
※ 실제로는 심볼이 전혀 없지만, 편의를 위해 rename
유심히 봐야할 부분은 GetCommandLineW 함수가 실행되는 부분(26번째 줄)과 mainCRTStartup 함수가 종료되기 전, exit() 함수(39번째 줄)와 main 함수(main, argc, argv는 rename, 실제는 sub_~~) 실행 부분(36번째 줄)이다.
GetCommandLineW 함수는 cmd창으로부터 CommandLine(argc, argv 포함)을 가져오는 함수인데, 이를 통해 argc와 argv가 세팅된다. GetCommandLineW 함수를 통해 얻어온 값을 전역변수 cmdLine_DD8568에 저장하는데, 해당 변수를 xref로 찾아가보면 ParseCommandLine(28번째 줄)내부가 나오고, 여기서 argc와 argv가 세팅되는 것을 볼 수 있다.
결국 36번째 줄에서 argc와 argv를 가져온 후, main 함수를 실행시키고, 반환된 결과는 exitcode로 exit() 함수에 전달되어 실행되는데 여기서 main함수를 제대로 반환해야 하는 이유를 얼핏 확인할 수 있다.
_scrt_common_main_seh 함수(Case 2)
- __p___argv() 함수 호출
- __p___argc() 함수 호출
- 해당 결과를 main 함수에 전달
(위의 사진은 main함수에서 argv를 사용 안 하기 때문에 최적화되어 나타난 결과) - main 함수 반환 값을 exit()에 전달
main 함수 찾기 정리
- start 함수 확인
- mainCRTStartup 함수 확인
- GetCommandLineW, __p___argv와 같은 인자와 관련된 변수 확인
(최적화때문에 케이스 바이 케이스가 될수도...) - mainCRTStartup 함수 반환 전, exit 함수의 인자 값을 어떤 함수로부터 반환되어 전달되는지 확인
TLS 설정같은 것도 보면 좋겠지만, 다른걸 해야 하므로 패스...
'Reversing' 카테고리의 다른 글
IDA String이 no Xrefs로 참조 안 될 때 (0) | 2017.11.17 |
---|---|
IDA 단축키 정리 (0) | 2017.11.17 |
[Windows Driver] Reversing (0) | 2017.10.12 |
Reversing C++ programs with IDA pro and Hex-rays 번역 (4) | 2017.10.03 |
C++ Reversing (0) | 2017.10.03 |