목록보안 (29)
Jiyong's STUDY
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일 때, 계산이 정상적으로 되지 않는다. 그 때 피..
앞선 프로그램들과 같은 역할이지만 구조적으로 많이 다르다. sub esp, 8 mov dword ptr ss:[ebp-8], edx mov dword ptr ss:[ebp-4], ecx sub 명령어를 사용하여 스택 공간을 확보하고 확보한 공간에 edx와 ecx를 저장했다. 이후에는 마찬가지로 eax에 저장하고 더하는 과정을 통해 결국엔 ecx+edx(10+20) 연산을 한 것이다. 또한 sub 명령어로 스택 공간을 확보한 것을 보아 함수2는 _fastcall을 이용한 함수임을 알 수 있다.