티스토리 뷰

  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)

  1. __p___argv() 함수 호출
  2. __p___argc() 함수 호출
  3. 해당 결과를 main 함수에 전달
    (위의 사진은 main함수에서 argv를 사용 안 하기 때문에 최적화되어 나타난 결과)
  4. main 함수 반환 값을 exit()에 전달


main 함수 찾기 정리

  1. start 함수 확인
  2. mainCRTStartup 함수 확인
  3. GetCommandLineW, __p___argv와 같은 인자와 관련된 변수 확인
    (최적화때문에 케이스 바이 케이스가 될수도...)
  4. 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
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31