Reversing/드림핵(dreamhack)

HelloWorld 분석

Roronoa 2022. 10. 17. 00:30
반응형

HelloWorld 소스코드

/*
    File: hello-world.cpp
    Build opts:
      - /MT -> Library Static Linking
      - /DYNAMICBASE:NO -> Disable ASLR
      - /od -> Disable Optimization
*/
#include <Windows.h>
#include <stdio.h>
char* str;
int main() {
  int delay = 1000;
  Sleep(delay);  // 1000ms(1초)를 대기합니다.
  str = (char*)"Hello, world!\n";
  printf(str);
  return 0;
}

이 프로그램은 1초를 대기하고 printf로 hello,world!를 출력하는 프로그램이다.

 

먼저 신뢰할 수 없는 프로그램일 경우 악성코드 프로그램을 대비해 정적분석도구인 IDA를 통하여 분석을 먼저 시도해 보겠다.

정적분석

[그림 1] ida 파일 열기

그림 1은 ida로 helloworld.exe파일을 연 모습이다.

ok누르고 실행을 하겠다.

 

[그림 2] string찾기

메뉴 > view > open sebview > strings 또는 shift+f12를 누르면 문자열을 볼 수 있다.

 

[그림 3] hello, world! 문자열

더블클릭하여 문자열을 따라 들어간다.

 

[그림 4] xref

aHelloWorld를 클릭하고 상호 참조의 단축키 X를 누르  xrefs(cross reference) 창이 나타납니다. 이 창에는 해당 변수를 참조하는 모든 주소가 출력된다.

 

[그림 5] main 함수

f5번을 눌러 디컴파일 한다.

[그림 6] F5 디컴파일

메인함수 동작 방식

1. Sleep 함수를 호출하여 1초 대기

2. qword_14001DBE0에 hello, world! 문자열의 주소를 넣음

3. sub_140001060에 Hello, world!를 인자로 전달하여 호출

 

qword_14001DBE0는 data영역의 위치한다.

hello, world!는 rodata에 위치한다.

sub_140001060는 printf함수이다.

 

[그림 7] printf 함수의 내부 구조

그림 7번에서 va가 선언되었고 va_start부분에서 va가 al를 가르킴으로써 가변인수를 처리한다. va는 char*형태이다.

v1에 _acrt_iob_func(1u)을 선언을 하였다. _acrt_iob_func함수는 스트림을 가져올 때 사용되는 함수로 인자로 1을 받았기 때문에 stdout을 의미한다. 따라서 문자열을 입력받고 stdout을 이용하여 출력하므로 printf임을 추측할 수 있다.

 

동적분석

[그림 8] main함수 f2로 중단점 설정

main함수에 f2번을 눌러 중단점을 설정하였다.

디버깅을 시작하기 위해 f9번을 누른다.

 

[그림 9] local windows debugger 사용

local windows debugger를 누른후 ok버튼을 눌러 시작한다.

 

[그림 10] 동적분석 시작

그림 10처럼 나오면 성공이다.

f8을 눌러서 하나씩 실행해보자!!

[그림 11] hello, world! 출력

1. sub rsp, 38h 를 통해 스택영역을 확보한다.

2. rsp + 0x20 위치에 0x3e8(10진수 1000)을 저장한다.

3. 0x3e8을 ecx로 옮긴다.

4. Sleep함수를 호출하여 1초동안 정지한다.

5. rax에 "hello, world!\n"의 주소를 옮긴다,

6. rax를 data 세그먼트의 주소인 0x14001dbe0에 옮긴다.

7. 0x14001dbe0에 저장된 값을 rcx에 옮긴다.

8. printf를 실행하여 "hello, world!\n"를 출력한다.

 

 

 

반응형

'Reversing > 드림핵(dreamhack)' 카테고리의 다른 글

rev-basic-1 LEVEL 1  (0) 2022.10.21
rev-basic-0 LEVEL 1  (0) 2022.10.20