정적 분석은 주로 main 함수를 찾고 분석하므로서 시작됨 함수를 찾는 방법은 크게 진입점(EntryPoint, EP)를 찾아 분석 대상 함수의 특성이나 외적 정보 분석 이 두 가지 정도가 있는데, 보통 진입점과 main 함수의 시작 시점이 동일하지 않기 때문에 진입점을 찾아 그 지점부터 분석하는 것 보다는 main 함수의 특성이나 외적 정보를 이용하여 찾음 1. 문자열 찾기 정적 분석을 할 때, 가장 많이 사용되는 정보는 "문자열" 디버깅 메세지나 로그 파일 생성 시에 여러 문자열들이 포함됨 로그 관련 문자열에는 로그를 생성하는 함수의 이름과 인자가 포함됨 shift + F12를 해서 문자열을 찾는 화면으로 이동한다 2. 상호 참조 해당 문자열이 어디서 사용됐는지 x를 눌러서 상호 참조 기능으로 해당 ..
PE File Format이란? Windows 실행 파일의 구성 방식 개발자가 코드를 작성하면 개발도구(VisualStudio)의 컴파일러가 PE File Format에 맞게 실행 파일로 만들어줌 - 컴파일 과정: 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 PE File 구조 - PE Header: DOS Header, Dos stub, NT Header, Section Header로 구성 - PE Body: 섹션들로 구성 PE File Header 작은 구조체들이 모여서 만들어진 데이터 덩어리 DOS Header: DOS와 호환성을 위해서 만들어짐. 파일의 처음에 위치하고 0x40 크기를 가짐 DOS Stub: PE 파일이 MS-DOS에서 실행될 경우, 화면에 출력될 메시지와 코드가 기록되어 있음..
1. x64 어셈블리어 개요 어셈블리 언어는 컴퓨터의 기계어와 치환되는 언어다. 따라서 기계어의 종류가 다양하다면 어셈블리 언어 또한 다양하게 존재한다. 필자는 ISA x64를 사용하기 때문에 x64 어셈블리어를 배울 예정이다. 2. 어셈블리어 구조 어셈블리어는 opcode(명령어)와 operand(피연산자)로 이루어져있다. opcode operand1 operand2 mov eax 3 명령어는 이런 종류가 올 수 있고, 명령어 데이터 이동 mov, lea 산술 연산 inc, dec, add, sub 논리 연산 and, or, xor, not 비교 cmp, test 분기 jmp, je, jg 스택 push, pop 프로시져 call, ret, leave 시스템 콜 syscall 피연산자에는 세 종류가 올..
1. 스택 프레임이란? 함수가 호출될 때에도 스택의 원리를 사용하게 됩니다. 예를 들어 아래와 같은 프로그램이 있다고 칩시다. int main() { func1(); } void func1() { func2(); } void func2() { } 그러면 스택에는 이런 식으로 함수들이 쌓이게 되겠죠. step1 step2 step3 main() func1() func2() main() func1() main() 이렇게 스택 영역에 차례대로 저장되는 각각의 함수 호출 정보를 스택 프레임 이라고 합니다. 예를 들자면 step 3에서는 스택 프레임 3개가 존재하게 되는 것입니다. 스택 프레임들도 마찬가지로 호출된 후 모든 프로그램 수행을 마치면 스택에서 삭제되겠죠? step4 step5 step6 func1()..