목록보안/리버싱, 어셈블리 (13)
Jiyong's STUDY

Machine은 어떤 CPU에서 이 파일이 실행될 수 있는지를 알려주는 역할을 한다. NumberOfSections는 섹션이 몇 개 있는지 알려주는 역할을 함. .text나 .rdata, .data와 같은 섹션을 말함. 보통 VS에서 MFC를 컴파일하면 .text, .rdata, .data, .rsrc로 4개의 섹션이 있고 NumberOfSection의 값도 4다. 어떠한 이유로 섹션의 수가 증가한다면 이 값도 증가한다. TimeDateStamp는 이 파일을 빌드한 날짜가 표시된다. obj 파일이 컴파일러를 통해 exe로 생성한 시간을 말한다. 델파이로 만든 파일은 이 값을 정상적으로 기록하지 않으므로 이 필드를 통해 빌드 시간을 확인할 수 없다. 이 필드는 4바이트를 차지하므로 0xA134F467와 같..

Signature은 "PE\0\0"를 표시하는 4바이트 값. 50 45 00 00이 된다. 그저 PE 파일임을 표시하는 용도 말고는 딱히 사용할 일이 없다. 하지만 요즘의 운영체제에서는 이 부분에 50450000이 아닌 다른 값이 들어오면 실행시키지 않는다. PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((DWORD) pDosHeader + pDosHdr->e_lfanew); if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { printf("This is not PE format.\n); } 위와 같은 코드에서 이용된다. PE 파일이 맞는지 확인하는 코드이다.

IMAGE_DOS_HEADER에서 e_magic 필드는 현재 파일이 PE 파일인지 체크하는 역할만 한다. e_magic==5A4D(IMAGE_DOS_SIGNATURE)이라면 PE 파일이 맞다. IMAGE_DOS_SIGNATURE은 PE 파일의 가장 첫 번째 값이다. PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpFileBase; if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) { printf("It's not PE File format.\n"); } 위와 같이 e_magic과 IMAGE_DOS_SIGNATURE을 비교하여 같은 지 확인할 때만 사용한다. 0x5A4D (메모리에선 4D 5A로, 리틀엔디언) e_lfanew는..
[ebp+4] 돌아갈 함수 주소 [ebp+8] arg1(파라미터==인자) // int 기준(4byte) ... byte값만큼 [ebp+4+@] [ebp-@] local 변수 byte값 만큼 내려감

순서대로 더하는 함수, 빼는 함수, 곱하는 함수, 나누는 함수(리턴은 나머지)다. int oper(int a, int b){ return a (op) b; } 로 보인다. 함수 기본구조 push ebp mov ebp, esp ... pop ebp retn (default = eax 리턴) add a, b eax에 a+b 16진수 sub a, b eax에 a-b 16진수 imul a, b eax에 a*b 16진수 idiv [a] eax에 eax에 저장된 값 / a에 저장된 값 연산 이후 16진수 몫, edx에 16진수 나머지 cdq는 idiv로 나눗셈 계산을 할 때, 피제수의 크기를 늘려주는 역할을 한다. 예를 들어 제수가 32bit이고 피제수가 32bit일 때, 계산이 정상적으로 되지 않는다. 그 때 피..

함수 진입때의 EBP는 00D9FCB0었고 프롤로그 이후 바뀌었으나 에필로그 이후 다시 00D9FCB0으로 돌아왔다. push ebp로 함수 진입시의 ebp값을 스택에 저장한 이후에 mov ebp, esp로 ebp에 esp의 값을 저장하고 함수가 끝날 때 esp와 ebp가 원상복구 되면서 함수 진입 직전의 주소를 기억하며 돌아갈 수 있는 것이다. main 함수에서 f1 함수로 진입하여 연산 후 리턴하여 main 함수로 돌아가는 구조인데, esp 하나뿐이면 esp는 함수 안에서 계속해서 바뀌기 때문에 다시 돌아갈 수 없다. 그렇기에 ebp에 저장을 해둔 뒤에 돌아갈 수 있는 것이다. 쉽게 함수는 자신만의 공간을 가지게 되며, 이를 스택프레임이라 한다.