정적 분석은 주로 main 함수를 찾고 분석하므로서 시작됨
함수를 찾는 방법은 크게
- 진입점(EntryPoint, EP)를 찾아 분석
- 대상 함수의 특성이나 외적 정보 분석
이 두 가지 정도가 있는데,
보통 진입점과 main 함수의 시작 시점이 동일하지 않기 때문에
진입점을 찾아 그 지점부터 분석하는 것 보다는
main 함수의 특성이나 외적 정보를 이용하여 찾음
1. 문자열 찾기
정적 분석을 할 때, 가장 많이 사용되는 정보는 "문자열"
디버깅 메세지나 로그 파일 생성 시에 여러 문자열들이 포함됨
로그 관련 문자열에는 로그를 생성하는 함수의 이름과 인자가 포함됨
shift + F12를 해서 문자열을 찾는 화면으로 이동한다
2. 상호 참조
해당 문자열이 어디서 사용됐는지 x를 눌러서
상호 참조 기능으로 해당 문자열이 사용된 주소를 추적함
따라가면 main 함수를 찾을 수 있게 됨
이것이 어셈블리 코드이고, 여기서 F5를 누르면 자동으로 디컴파일이 됨
3. main 함수 분석
- 인자: argc, argv, envp
- 동작
- Sleep 호출
- qword_14001DBE0에 "Hello, world!\n"의 주소를 넣음
- sub_140001060에 "Hello, world!\n"을 인자로 전달하여 호
- 0 반환
- 반환 값: 0
qword_14001DBE0는 data 영역,
"Hello, world!\n"는 rodata 영역,
sub_140001060는 printf() 함수이다
이게 메모리 영역 구성인데
TEXT 영역은 코드가 컴파일 된 후
기계어로 번역되어 저장되있는 곳
RODATA 영역은 Read Only Data로
주로 상수, 상수형 문자열, printf의 중괄호
등이 저장되는 곳
DATA와 BSS 영역은 둘 다 전역변수를 저장함.
BSS는 초기화 전의 전역변수,
DATA는 초기화 후의 전역변수를 저장.
BSS 영역의 전역변수는 main 실행 전,
전부 0으로 초기화 되어 DATA 영역으로 이동함.
4. IDA 단축키
- BreakPoint(F2): 중단점을 설정합니다. 프로그램이 해당 지점에 도달하는 순간 정지
- Restart(Ctrl + F2): 디버깅을 중단
- Run(F9): 프로그램을 계속 실행, 또는 디버깅을 시작
- Step Into(F7): 어셈블리 코드를 한 줄 실행. 함수의 호출이라면, 함수 내부로 들어감
- Step Over(F8): 어셈블리 코드를 한 줄 실행. 함수 내부로는 들어가지 않음