목록Hacking/Reverse Engineering (6)
whois
본 글은 아래의 세 가지 내용을 중점적으로 다룬다. · 세 개의 인자를 넘기는 함수 호출 코드· 어셈블리· 스택 [그림 1] 세 개의 인자를 넘기는 함수 호출 코드 그림 1과 같은 코드를 들고 온 이유는 함수 호출을 하면서 인자를 넘길 때 스택에 들어가는 인자들의 순서를 알아보기 위해서다.C언어를 함수까지 배우신 분들이라면 충분히 이해할 수 있을거라고 본다.간단하게 설명하자면, main 함수에서 go라는 함수 호출을 하면서 세 개의 인자를 넘겨주고 있다. [그림 2] 어셈블리 go 함수와 main 함수 외의 어셈블리 코드들은 다 제거하였으니 참고바란다. go 함수를 호출 할 때 스택의 main 함수 해당하는 공간에 39h, 38h, 37h 순으로 푸시하고 있다. 이는 LIFO(Last In First O..
· 스택(Stack) "LIFO(Last In First Out) 구조를 가지는 자료구조이다." 스택 관련 알아야 할 지식1. 함수 호출 시 파라미터가 들어가는 방향2. 리턴 주소3. 지역 변수 사용 함수 안에서 스택을 사용할 때 다음과 같은 코드가 엔트리 포인트에 생성된다.push ebpmov ebp, espsub esp, 50h ① ebp 레지스터를 스택에 넣는다.② 현재 esp 값을 ebp에 넣는다.③ esp에서 50h만큼 빼서 공간을 확보한다. [그림 1] 함수 프롤로그 좀 더 구체적인 동작 과정을 설명하기 위해 그림 1을 그려봤다. 첫 번째 push ebp를 하게 된 후에 그림은 노란색으로 표시 된 것과 같다. EBP는 Base Pointer를 가리키며, ESP는 현재 스택의 최상단 EBP 위쪽..
· PUSH, POP"스택에 값을 넣는 것을 PUSH, 스택에 있는 값을 가져오는 것이 POP이다."PUSHAD, POPAD는 모든 레지스터를 PUSH하고 POP하라는 명령어이다.오퍼랜드는 1개만 있으면 된다. · MOV"값을 이동시키는 역할을 하며, 리눅스에서 cp 명령어와 같다고 볼 수 있다." · LEA"MOV와 혼동할 수 있는 명령어로, MOV는 값을 가져오지만 LEA는 주소를 가져온다." ex) 레지스터와 메모리에 다음과 같은 값이 들어 있다고 가정한다.esi : 0x401000*esi : 12345678 lea eax, dword ptr ds:[esi]: esi가 번지수가 0x401000이니 eax에 0x401000이 들어간다. mov eax, dword ptr ps:[esi]: 0x40100..
레지스터란 "CPU가 사용하는 변수"이다. · EAX "가장 많이 쓰는 변수로써, 산술 계산을 할 때 사용하고 리턴값을 전달한다." [그림 1] EAX 레지스터 내부 16비트 시절에는 EAX가 아닌 AX 레지스터를 사용하였지만, 32비트로 넘어오면서 Extended 즉, 확장된 EAX 레지스터를 사용한다.EAX 레지스터의 내부 구조는 그림 1과 같다. AX는 AH와 AL을 가진다.구체적으로, 높은 주소인 AH와 낮은 주소인 AL 8비트씩 모여 16비트인 AX가 된다. [그림 2] 레지스터 개념 테스트 코드 그림 2와 같이 테스트 코드를 만들어 레지스터 개념을 잡아볼까 한다.① 0x12345678이라는 16진수 값을 eax에 넣는다.② 0x12340000이라는 16진수 값을 edx에 넣는다.③ ax 값(0..
어셈블리란 "리버스 엔지니어링을 하기 위한 가장 기초적인 도구"이다.어셈블리는 한 번에 한 가지 동작만 할 수 있다. · IA-32 형태명령어 + 인자ex) mov eax, 1→ 1을 eax 장소에 옮겨 담아라. 명령어는 옵코드(opcode)라고도 한다.인자는 "어떤 장소를 사용할지" 또는 "명령어에 해당하는 값"이라고 보면 된다. 앞의 인자가 도착지, 뒤의 인자가 출발지가 된다. 위의 예시에서 eax가 도착지, 1이 출발지가 된다.인자는 보통 3개까지 나오며, 4개 이상은 잘 나오지 않는다.
리버스 엔지니어링이란 간략하게 "소스코드를 역추적하는 것"을 말한다. 코딩을 하고 최종적으로 컴파일까지 완료했다면 EXE, DLL 파일 등이 생성된다.제작자가 아닌 사람들은 컴파일 된 파일들의 소스코드를 볼 수 없는 것이 일반적인 상식이다.하지만, 리버스 엔지니어링이라는 기술을 사용하면 바이너리 분석을 통해 원래의 소스코드가 어떤 식으로 만들어졌는지 파악이 가능하다.또한, PE Header 분석을 통해 어떤 라이브러리가 링크돼 있는지 분석 할 수 있다. · 리버스 엔지니어링 적용 범위① 모의해킹, 취약점 발견 ② 보안코드 개발③ 버그 수정④ 신기술 연구와 학습 · 리버스 엔지니어링 전 필수 조건① C/C++에 대한 코드 작성 능력 ② 라이브러리 컨트롤 능력③ Win32 API 및 시스템 프로그래밍 기반지..