정적 분석
main 함수 찾기🔍
바이너리에서 함수를 찾는 방법
- 프로그램의 시작 지점인 Entry Point (진입점)부터 분석을 시작해 원하는 함수를 찾을 때까지 탐색
- 대상 함수의 특성이나 프로그램의 여러 외적인 정보를 이용해서 탐색
문자열 검색
- 정적 분석시 많이 사용되는 정보는 프로그램에 포함된 문자열
- Shift + F12 → 문자열 검색창
상호 참조🔀
- 정적 분석을 하다가, 어떤 수상한 값이나 함수를 찾았다면, 우리는 이를 참조하는 함수를 분석
- 단축키 x
- 해당 변수를 참조하는 모든 주소가 출력


💡 main 함수를 찾는 일반적인 방법
- 일반적으로 main함수는 C계열 언어에서 프로그래머가 작성한 코드 중 가장 먼저 실행되는 함수
- 운영체제는 바이너리를 실행할 때, 바이너리에 명시된 진입점부터 프로그램을 실행함
- 진입점이 main 함수인게 불가능한 것은 아니지만, 일반적으로는 그렇지 않음
- 진입점과 main 함수의 사이를 채우는 것은 컴파일러의 몫
- 대부분의 컴파일러는 둘 사이에 여러 함수를 삽입해서 바이너가 실행될 환경을 먼저 구성하고, 그 뒤에 main 함수가 호출되게 함.
- main 함수를 쉽게 찾기 위해서는 컴파일로 작성하는 진입점에 위치한 함수에 익숙해져야함

1. parameter
- IDA는 argc, argv, envp로 3개의 인자를 받는다고 해석함
2. 동작
- Sleep함수를 호출해 1초 대기
- 0x3E8u → 1000
- qword_14001DBE0에 “Hello, world!\n” 문자열의 주소를 넣는다.
- sub_140001060에 “Hello, world!\n” 를 parameter로 전달하여 호출
- 0을 반환
3. 반환값
- 0
|
qword_14001DBE0
|
값이 변경될 수 있는 전역변수 → data 섹션
|
|
"Hello, world!\n”
|
실행 도중 값이 변경될 일 없는 상수 → rodata 섹션
|
|
sub_140001060
|
|
sub_140001060 함수 분석

- va_start 함수를 통해 가변 인자를 처리하는 함수
- __acrt_iob_func 함수는 스트림을 가져올 때 사용되는 함수 → 인자로 들어가는 1 : stdout
- 문자열 인자를 받고 stdout 스트림을 내부적으로 사용하는 가변 함수
→ sub_140001060 함수는 printf 함수로 추정
💡 스트림이란?
데이터가 조금씩 흘러온다는 의미에서 명명되었음
데이터는 스트림의 형식으로 한 프로세스에서 다른 프로세스로, 한 프로세스에서 다른 파일로 이동함
- OS는 stdin(standard input), stdout(standard output), stderr(standard error)와 같은 기본 스트림을 프로세스마다 생성
- printf함수는 stdout을 통해 출력 데이터를 우리가 볼수 있도록 함
- scanf함수는 stdin으로 받아서 프로세스에 전달함.
동적분석
- Breakpoint(F2): 중단점을 설정합니다. 프로그램이 해당 지점에 도달하는 순간 정지합니다.
- Restart(Ctrl + F2): 디버깅을 중단합니다.
- Run(F9): 프로그램을 계속 실행, 또는 디버깅을 시작합니다.
- Step Into(F7): 어셈블리 코드를 한 줄 실행합니다. 함수의 호출이라면, 함수 내부로 들어갑니다.
- Step Over(F8): 어셈블리 코드를 한 줄 실행합니다. 함수 내부로는 들어가지 않습니다.
'Reversing > Dreamhack : Reverse Engineering' 카테고리의 다른 글
| [Dreamhack] rev-basic-0 (0) | 2025.04.21 |
|---|---|
| [Dreamhack] patch (0) | 2025.04.21 |
| Quiz: x86 Assembly 2-3 (0) | 2025.04.16 |
| Quiz: x86 Assembly 1 (0) | 2025.04.16 |
| x86 Assembly🤖: Essential Part (0) | 2025.04.16 |