IDA를 사용하여 Helloworld.exe 실행파일 정적분석을 해보려고 합니다.
먼저 IDA 창을 열어줍니다.
이런 창이 나오면 분석하려는 파일을 창으로 드래그해줍니다.
파일이 정상적으로 열리면 위와 같은 창이 나타나는데 아무것도 변경하지 말고 OK를 클릭합니다.
프로그래머는 디버깅 메세지를 출력하거나, 로그 파일을 생성하는 등의 목적으로 여러 문자열을 프로그램에 포함시키는데, 이 문자열들은 특성상 유용한 정보를 제공할 때가 많습니다.
정적 분석을 하다가 수상한 값이나 함수를 찾았다면 이를 참조하는 함수를 분석하고 싶을 것입니다. 많은 도구들은 상호 참조(Cross Reference, XRef)라는 기능을 통해 이를 지원합니다.
"aHelloWorld”를 클릭하고 상호 참조의 단축키 X를 누르면 xrefs(cross reference) 창이 나타납니다. 이 창에는 해당 변수를 참조하는 모든 주소가 출력됩니다.
첫 번째 항목을 더블 클릭하여 이를 따라가면 main함수를 찾을 수 있습니다.
F5를 눌러 디컴파일을 할 수 있습니다.
<인자 분석>
IDA는 argc, argv, envp로 3개의 인자를 받는다고 해석했습니다.
<동작>
Sleep함수를 호출하여 1초 대기합니다.
qword_14001DBE0에 “Hello, world!\n” 문자열의 주소를 넣습니다.
sub_140001060에 “Hello, world!\n” 를 인자로 전달하여 호출합니다.
0을 반환합니다.
<리턴값>
0을 리턴합니다.
sub_140001060 함수로 들어가보겠습니다.
이 함수의 디컴파일 결과는 다음과 같습니다.
먼저 va_start 함수를 통해 가변 인자를 처리하는 함수임을 알 수 있습니다. __acrt_iob_func 함수는 스트림을 가져올 때 사용되는 함수인데, 인자로 들어가는 1은 stdout 을 의미합니다. 문자열 인자를 받고 stdout 스트림을 내부적으로 사용하는 가변 함수임을 알 수 있습니다. 따라서 sub_140001060 함수는 printf 함수로 추정할 수 있습니다.
이렇게 정적분석을 통해 이 파일은 "Hello, world!"를 출력해주는 프로그램인 것을 알 수 있습니다.