리버싱/리버싱 입문 9

리버싱 입문_6장 지뢰찾기 게임

리버싱 시 팁들 비교구문을 잘 눈여겨 보자 예) CMP A,B 비교구문 실행 후 점프문 실행 전 제로 플래그를 바꾸어 가면서 결과의 변화를 통해 어떤 코드인지 예측해보자. CALL 구문을 눈여겨 보자 예) CALL 주소 어떤 서브루틴을 호출하는지 F7을 통해 스탭 인투로 로직을 살펴보기도 하면서 어떤 기능인지 알아보자. 리버싱은 디버거로 코드와 스택, 메모리에 있는 값을 관찰하면서 의미하는게 무엇인지 추측하고 프로그램을 반복적으로 실행하면서 추측이 맞는지 확인해야한다.

리버싱 입문 4장 리버싱 좀더 깊숙이 128~139쪽

1.콜 스택 프로그램에서 사용하는 서브루틴에 대한 정보를 저장하기 위한 자료구조. 사용하는 주 목적은 서브루틴 간 호출 순서를 추적할 수 있는 정보를 저장하는 것. 예) 서브루틴 호출 순서가 A -> B -> C일때 서브루틴 C가 종료됐을때 B가 어디로 되돌아가서 다시 동작을 계속해야 할지에 대한 정보를 콜 스택에 저장한다. 서브루틴 A가 명령어 6까지 있다고 가정할때 3까지 실행 후 서브루틴 B를 호출 -> 서브루틴 B가 저장된 위치로 가서 서브루틴 B의 명령어인 명령어 1 ~ 명령어 3까지 순서대로 수행하고 다시 서브루틴 A로 돌아옴 -> 복귀 주소는 서브루틴 B의 호출 명령어 다음인 명령어 4임 (자세한건 133쪽 참고) 복귀주소는 스택이라는 자료구조에 넣어두고 B의 동작이 완료후 사용해서 복귀2...

abex crackme 3 풀이 + 함수 호출 규약

1. 프로그램 개발 언어 알아내기 Detect It Easy 프로그램을 설치하고 실행하여 개발 언어, 패킹 여부를 알아내려는 프로그램을 연다. 그렇다면 이런 창이 뜰 건데 여기 빨간 줄이 쳐져 있는것이 그 프로그램의 언어이다. (패킹 여부는 필자가 이 시점에서 배우지 않아 일단 생략한다.) 패킹 여부와 프로그램의 언어를 알아내는 것은 프로그램을 분석하기에 앞서 중요하다고 하니 꼭 습관을 들여야겠다. 2. 함수 호출 규약 함수를 호출할 때 인자를 전달하는 방식으로 "cdecl", "stdcall", "fastcall" cdecl : 매개변수가 오른쪽에서 왼쪽으로 스택으로 전달된다. 예를 들어 매개변수가 a,b인 sum 함수를 호출하면... sum(a,b); b와 a순서로 스택에 전달된다는 의미이다. 또한 ..

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 파일을 실행하려고 헤더 정보..