정적분석
1. IDA로 파일 열기
2. 문자열 검색 Shift + F12
3. HELLO WORLD 문자열 찾기
4. 문자열 더블 클릭
5. X를 눌러 상호 참조(Cross Reference, XRef)
6. MAIN 함수 발견
7. F5 눌러 디컴파일
8. 생각해보기
DATA
- qword_14001DBE0 : 변경 될 수 있는 전역변수
RODATA
- "Hello, world!\n" : 실행 도중 값이 변경될 일 없는 상수임
sub_140001060 : printf() 함수
- va_start 함수 : 가변 인자를 처리하는 함수
- __acrt_iob_func 함수 : 스트림을 가져올 때 사용되는 함수 ( 1 : stdout )
-> 문자열 인자를 받고, stdout 스트림을 내부적으로 사용하는 가변 함수임
동적분석
1. MAIN 함수에 중단점 설정 F2
2. 디버깅 시작 단축키 F9
1) sub rsp, 38을 통해 main 함수가 사용할 스탯 영역 확보
2) rsp+0x20에 4 바이트 값인 0x000003e8 저장
3) rsp+0x20에 저장된 값을 ecx에 옮김. 함수의 첫 번째 인자 설정
4) Sleep함수를 호출
5) "Hello, world!\n" 문자열의 주소를 rax에 옮김
6) 0x14001a140의 데이터를 보면 문자열이 저장되어 있음
7) rax의 값을 data세그먼트의 주소인 0x14001dbe0에 저장
8) 0x14001dbe0에 저장된 값을 rcx에 옮김
9) 0x140001060함수를 호출
10) 프로그램 확인하면 Hello, world! 출력 가능
함수 내부로 진입하기
1. printf를 호출하는 0x14000110b에 중단점 설정
2. 디버깅 다시 시작 후 0x14000110에서 f7을 눌러 함수 내부로 진입함
'리버싱' 카테고리의 다른 글
[드림핵] 6. x86 Assembly🤖: Essential Part(2) (0) | 2024.05.18 |
---|---|
[드림핵] 5. x86 Assembly🤖: Essential Part(1) (0) | 2024.05.18 |
[드림핵] 4. Background: Windows Memory Layout (0) | 2024.05.18 |
[드림핵] 3. Background: Computer Architecture (0) | 2024.05.18 |
[드림핵] 2. Background: Static Analysis vs. Dynamic Analysis (0) | 2024.05.18 |