리버싱 26

abexcrackme1 풀이

위는 abex crackme1 예제의 코드 화면이다. abexcrackme1을 푸는 방법은 여러가지라고 하는데 이 게시물에서는 두가지 방법만 사용해서 풀것이다. 1. 점프문으로 레지스터 값 동일하게 하기 이 방법은 간단하지만 어려운 문제가 나오면 이런 방법으로는 실력을 키우지 못할수도 있다고 하니 참고만 하자. 먼저 0040101F에서 JMP SHORT 0040_1021은 바로 다음 명령어 줄인 0040_1021로 이동한다는 의미이다. 그리고 코드를 살펴보면 주소 0040_1024의 명령어가 눈에 띈다. 이 명령어는 CMP EAX, ESI 값을 비교하여 같다면 0040_103D로 이동하는 명령어이다. 즉 EAX(현재 하드디스크의 값을 의미하는 3이 들어있다.)와 ESI(0이 들어있다)값이 같으면 0040..

리버싱 입문 1장 6. 어셈블러 기초 지식

1. 어셈블러의 개요 어셈블러 : 컴퓨터가 이해할 수 있는 연속적인 비트로 구성된 기계어를 사람이 알아볼수 있도록 만든 일종의 매크로 모음. 어셈블러와 기계어는 1:1로 매칭됨 2. 어셈블러 기본 구조 어셈블러 명령어는 최대 3개까지 인자를 받아들일 수 있음. 1) 2개의 인자를 사용하는 명령어 ADD 예) ADD EAX, EBX -> EAX레지스터의 값에 EBX 레지스터 값을 더해 EAX 레지스터에 다시 저장하는 동작 고급 언어 : EAX = EAX + EBX 헥사 코드 : 01D8 2) 1개의 인자를 사용하는 명령어 INC INC ESI -> 인자로 오는 ESi 레지스터 값을 1만큼 증가 고급 언어 : ESI = ESI + 1 헥사 코드 : 46 PUSH 뒤에 오는 인자를 스택의 맨 위에 입력함 PU..

리버싱 입문 1장 4. PE 파일

컴파일러 : 고급 언어로 개발된 프로그램을 컴퓨터가 이해할수 있는 기계어로 번역해 주는 것 쉽게 이야기하면 파*고처럼 고급 언어 -> 기계어와 같은 번역기이다. (물론 번역기 역할만 하는건 아님) 번역된 기계어가 파일(EXE, DLL)로 만들어지는데 이게 PE파일이다. PE 파일 헤더와 보디로 구성된다. 헤더에는 동작에 대한 규칙이 담겨있고 보디에는 기계어들이 저장되어 있다. 구성은 PE 헤더, 섹션 헤더, 섹션 데이터로 구성된다. PE 헤더는 모든 윈도우가 공통으로 가지고 있다. 섹션 헤더는 PE파일마다 다 다르다. 1 PE파일에는 최소1 섹션헤더가 있다. 섹션 데이터도 마찬가지이다. 주소 지정 방법과 용어 pFile : PE 파일 내부에서의 오프셋 물리적으로 하드디스크에 저장되었을때 의미 있는 값 R..

리버싱 입문 1장 3 스택과 스택 프레임

1.스택 후입 선출 방식으로 동작하는 특별한 자료 구조 POP 과 PUSH라는 동작을 지원하는데 PUSH는 데이터를 넣는 명령어 POP은 꺼내는 명령어이다. 그냥 이름만 봐도 알 수 있다 PUSH를 하면 스택의 주소는 4바이트만큼 감소하면서 데이터가 스택으로 들어간다. POP을 하면 스택의 주소가 다시 4바이트만큼 증가하고 데이터가 꺼내진다. (데이터를 넣어서 용량이 줄어들고 데이터를 꺼내서 용량이 다시 늘어난다고 이해하면 된다.) 앞 게시글에 서술했던 ESP(스택 마지막 주소를 가리키는 레지스터)레지스터에 스택의 위치가 저장되어 있다. 스택에 값을 집어넣거나 빼면 ESP 레지스터 값이 실행한 명령어대로 4바이트씩 증가 혹은 감소한다. 2. 스택 프레임 함수가 가지는 자신만의 스택 영역 함수 내부에서 사..

리버싱 입문 1장 1. 리버싱을 위한 프로그램 실행 구조

PE 파일 윈도우에서 실행 파일을 부르는 이름 헤더와 보디 헤더에는 배치 정보가 들어있고 보디에는 코드와 데이터가 들어 있음. PE 포멧 실행시 1.운영체제의 로더가 PE 헤더에 있는 정보를 분석해 PE 보디에 있는 코드와 데이터를 메모리에 배치 2. PE 파일이 메모리에 로딩 될시 코드 영역과 (프로그래머가 만든 함수 등과 같은 코드) 데이터 영역(정적 변수와 전역변수)에 자료가 들어감. 3. 프로그램이 실행시 스택 영역에 (흔히 아는 지역 변수와 함수의 매개변수) 히프 영역(그 C언어 malloc()함수로 동적할당한 거)에 데이터가 쌓인다. 엔트리 포인트 main() 함수처럼 첫번째로 실행되는 위치이자 PE 파일 실행이 시작되는 주소. 운영체제가 알아서 메모리에 있는 PE 파일을 실행하려고 헤더 정보..