목록보안/리버싱, 어셈블리 (13)
Jiyong's STUDY
바이트 저장 순서는 엔디언(endian)이라 한다. 우리가 흔히 사용하는 순서는 빅 엔디언이다. 이것의 반대 방향은 리틀 엔디언이라고 한다. 0x12345678이라는 dword값이 있을 때, 12 34 56 78 이렇게 읽어나가면 빅 엔디언이고 78 56 34 12 이렇게 읽어나가면 리틀 엔디언이다. 이것은 인텔 CPU에서 채택한 방법이다. 리버싱을 할 때 보통 2바이트나 4바이트 값은 리틀 엔디언을 사용한다고 생각하자.

module has entry point outside the code와 같은 문제가 발생한다면 코드를 빌드할 때 debug로 하지 말고 release로 빌드하면 된다. 아무튼 빌드한 exe 프로그램을 ollydbg에 올리면 이런 화면이 나오는데 여기서 Hello World!를 출력하는 부분을 찾아야 한다. F7(함수 내로 들어감)이나 F8로 한 줄씩 실행하며 가다가 프로그램에서 Hello World!가 출력되는 부분을 찾으면 F2로 BP를 찍어두고 Ctrl+F2로 재실행하면 된다. 또는 Ctrl+G로 main 함수를 찾을 수도 있다. 아무튼 찾은 이후 아래 Dump Window에서 Ctrl+G로 주소를 검색하면 이제 메모리에 직접 접근하여 수정을 할 수 있다. 다만 여기서 직접 수정하는 경우엔 Hell..
자료구조에서 배울 수 있는 stack 자료구조에 대한 설명. 일단 stack 자료구조의 ADT와 예제 func.h #pragma once #ifndef __AB_STACK_H__ #define __AB_STACK_H__ #define TRUE 1 #define FALSE 0 #define STACK_LEN 100 typedef int Data; typedef struct _arrayStack { Data stackArr[STACK_LEN]; int topIndex; }ArrayStack; typedef ArrayStack Stack; void StackInit(Stack* pstack); int SIsEmpty(Stack* pstack); void SPush(Stack* pstack, Data data)..
//책에서는 명령어를 강제적으로 외우지 않는 것을 권함. PUSH, POP 스택에 값을 넣는 것을 PUSH, 그리고 스택에 있는 값을 가져오는 것이 POP다. (PUSHAD, POPAD는 모든 레지스터를 PUSH, POP 하라는 명령어다) MOV MOV는 단지 값을 넣는 역할을 한다. LEA LEA는 주소를 가져오는 역할이다. MOV와 헷갈릴 수 있다. MOV는 값을, LEA는 주소를 가져온다. 대부분 가져올 src 오퍼랜드가 주소라는 의미로 []로 둘러쌓여 있다. 예시로 esi: 0x401000 *esi: 5640EC83 esp+8: 0x13FF40 *(esp+8): 33 lea eax, dword ptr ds:[esi] : esi가 0x401000이므로 eax에는 0x401000이 들어온다. mov ..
IA-32 레지스터는 범용 레지스터가 8개 있다. 레지스터를 '변수'로 이해하면 이해하기 쉽다. 정확하게 "변수는 변수인데, CPU가 사용하는 변수다." 레지스터는 EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP로 총 8개다. EAX부터 EDX까지는 ABCD순인데 정확히는 EAX, EDX, ECX, EBX의 순으로 외우는게 맞다. EAX (Extended Accumulator Register) Accumulator. 이 레지스터의 역할을 요약하면 산술 계산을 하며, 리턴값을 전달한다. 쉽게 생각하면 단지 "변수"이며, 구체적으로는 "가장 많이 쓰는 변수"이다. 계산식에 사용되며 사칙연산 등에 자주 등장한다. 함수의 리턴값이나 return 100, return FALSE 등의 코드를 ..
x86 CPU의 기본 구조인 IA-32 기준 IA-32의 기본 형태는 "명령어 + 인자" 로 이루어졌다. 예를 들어 push 337 으로 되어있다면 여기서 mov나 push같은 것을 명령어라고 한다. 이는 옵코드(opcode)라고 한다. 그 뒤에 인자가 들어오는데 인자는 명령어 다음에 "어떤 장소로 값을 넣을 것인지", 또는 "명령어에 해당하는 값" 등이 된다. 이는 오퍼랜드(operand)라고 한다. mov eax, 1 이런식으로 있다면 여기서 옵코드는 mov, 오퍼랜드는 eax와 1 두개가 된다. 참고로 모든 오퍼랜드는 앞의 것이 destination이고 뒤의 것이 source이다. (예시로 memcpy, strcpy)