목록Ethical Hacking (17)
KoreanFoodie's Study
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 챕터 8은 두 번째 crackme를 다룬다. (abex' 2nd crackme) VB 파일은 MSVBVM60.dll(Microsoft Visual Basic Virtual Machine 6.0) 이라는 VB 전용 엔진을 사용한다. (The Thunder Runtime Engine 이라는 이름으로도 불리고 있음) VB 엔진의 사용 예를 보자. 메시지 박스를 출력하고 싶을 때, VB 소스코드에서 MsgBox() 함수를 사용한다. VB 컴파일러는 실제로 MSVBVM60.dll!rtc MsgBox() 함수가 호출되도록 만들고, 이 함수 내부에서 Win32 API인 user32.dll!MessageBox() 함수를 호출해주는 방식으로 동작한다. (VB ..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 스택 프로세스에서 스택 메모리의 역할은 아래와 같다. A. 함수 내의 로컬 변수 임시 저장 B. 함수 호출 시 파라미터 전달 C. 복귀 주소(return address)저장 프로세스에서 스택 포인터(ESP)의 초기 값은 Stack Bottom쪽(그림 아래쪽)에 가깝다. PUSH 명령으로 스택에 값을 입력하면 스택 포인터(ESP)는 감소하고, POP 명령으로 스택에서 값을 꺼내면 스택포인터는 증가한다. 즉, 스택은 거꾸로 자란다! POP EBP 를 하면 EBP 값이 변하는데, PUSH 의 경우에는 PUSH EBP 명령어를 실행해도, 현재의 EBP 값(예: 0019FF38) 값만 메모리에 저장되지 EBP 자체의 값은 바뀌지 않는다. POP EBP ..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 1. CPU 레지스터란? 레지스터(Register)란 CPU 내부에 존재하는 다목적 저장 공간이다. 우리가 일반적으로 메모리라고 얘기하는 RAM(Random Access Memory)과는 조금 성격이 다르다. CPU가 RAM에 있는 데이터를 엑세스(Access)하기 위해서는 물리적으로 먼 길을 돌아가야 하기 때문에 시간이 오래 걸린다. 하지만 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다. 레지스터의 종류 Basic program execution registers x87 FPU registers MMX registers XMM registers Control registers Memory management regis..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 바이트 오더링 : 바이트 오더링은 데이터를 저장하는 방식이라고 기억하면 된다. 크게 두 가지로, 빅 엔디언(Big Endian)과 리틀 엔디언(Little Endian)방식이 있다! TYPE | Name | SIZE | 데이터 | 빅 엔디언 Style | 리틀 엔디언 Style |:----|:----|:----|:----|:----|:-----| BYTE | b | 1 | 0x12; | [12] | [12] WORD | w | 2 | 0x1234; | [12][34] | [34][12] DWORD | dw | 4 | 0x12345678 | [12][34][56][78] | [78][56][34][12] char [] | str | 6 | "ab..
'리버싱 핵심 원리'의 내용 및 이슈들과 해결책을 다룹니다. 1. EP(Entry Point) EP(Entry Point)란 Windows 실행 파일 (EXE, DLL, SYS등)의 코드 시작점을 의미한다. 프로그램이 실행될 때 CPU에 의해 가장 먼저 실행되는 코드 시작 위차라고 생각하면 된다. 2. 디버거 명령어 명령어 |단축키 |설명 |:------|:-------|:------| Go to | [Ctrl+G] | 원하는 주소로 이동(코드/메모리를 확인할 때 사용. 실행되는 것은 아님) Execute till Cursor | [F4] | cursor 위치까지 실행 (디버깅하고 싶은 주소까지 바로 갈 수 있음) Set/Reset Breakpoint | [F2] | BP 설정 / 해제 Run | [F9..
'리버스 엔지니어링 바이블'의 핵심 내용 및 이슈들과 해결책을 다룹니다. Windows programming 맛보기 #include #include #include void RunPorcess() { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); //start the child process. if (!CreateProcess(NULL, "MyChildProcess", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) ) { printf("CreateProcess failed.\n"); return; } // Wa..
C 언어로 어셈블리 사용해 보기! 어셈블리로 두 변수의 값을 더하는 코드를 짜 보자! #include #include int Plus(int a, int b) { return a +b; } _declspec(naked) PlusAsm(int a, int b) { _asm { mov ebx, dword ptr ss:[esp+8] mov edx, dword ptr ss:[esp+4] add edx, ebx mov eax, edx retn }; } void main(int argc, char *argv[]) { int value = Plus(3, 4); printf("value: %d\n", value); int value2 = PlusAsm(3,4); printf("value2: %d\n", value2);..