본문 바로가기

[Reversing] CodeEngn BasicRCE Level1 [문제01] HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가? GetDriveTypeA의 리턴값을 물어보는 것으로 해당 API 함수에 대한 리턴값을 조사한 뒤 인증하면 된다. 하지만 간단히 파일을 다운받을 수 있도록 하였으니 확인해 본다. Basic_L01.exe 파일을 다운받은 후 실행하면 다음과 같은 메세지 창을 차례로 띄운다. 이 메세지 창만으로는 확신할 수 없다... Ollydbg로 파일을 열어 코드를 확인한다. 코드의 끝이다. 문제가 거창하게 느껴질 정도다. MessageBoxA라는 API함수를 호출하여 처음의 메세지창을 띄운 뒤, 해당 함수의 리턴값을 비교한뒤 JE 구문을 만족할 경우 OK~~!@ 이 부분으로 점프하게 된다. 해결방법은 2가.. 더보기
[System] 기계어의 구성(명령어 형식 : Instruction Format) 이전에 마이크로프로세서가 읽어들이는 숫자화된 명령어의 집합을 기계어라 하였으며, 이 기계어는 실제 시스템 프로그래밍을 하면서 직접 다루어야할 경우가 많다. 대표적인 예는 디스어셈블러나 디버거를 작성하는 경우이지만, 이외에 프로그래밍 언어에 의하여 컴파일되어진 실행 이미지의 내용을 직접 조작해야할 때나 프로그램의 함수 호출을 중간에 가로채야 하는 API-Hooking과 같은 테크닉에서 사용될 수 있다. 그럼 이제부터 실제 기계어 코드가 어떻게 구성되어 있는지 본격저으로 알아보도록 할 것이며, 여기에서 다루는 기계어 코드는 인텔 마이크로프로세서 또는 그 호환 기종에 기반한 것이다. 인텔 마이크로프로세서는 아래와 같은 내용들이 묶여 하나의 명령어를 구성하게 되는데, 이들 요소는 그 명령어에 따라 존재하는 요소.. 더보기
[System] 바이트 순서 (Little Endian과 Big Endian) 다중 바이트로 이루어진 수를 단일 주소를 가진 하나의 데이터로 다루어야 할 필요가 있을 때 어떠한 바이트 순서로 그 데이터를 배열할 것인지 결정하는 것은 엔디언(Endian)이라 하며, 이때 낮은 주소에 최하위 바이트를 저장하는 방식을 리틀 엔디언(Little Endian)이라고 부르며, 이와는 반대로 낮은 주소에 최상위 바이트를 저장하는 방식을 빅 엔디언(Big Endian)이라고 부른다. 0x12345678 ※ 최상위 비트 : 12 ※ 최하위 비트 : 78 Little Endian과 Big Endian의 어원은 동화 [걸리버 여행기]에서 출발한다. 걸리버가 여행하던 소인국은 크게 2개의 파벌로 나뉘고 있었다. 그 기준은 달걀을 처음 깨는 방법, 달걀의 뾰족한 부분을 먼저 깨야한다는 파와 그 반대인 넓.. 더보기
[CPU] 80286과 80386 마이크로프로세서 1. 80286 80286은 외부적으로 8086에 비해 더 빠른 속도와 더 많은 어드레스(24비트의 주소선)를 다룰 수 있게 된 것 외에 내부적으로 보호모드(Protected Mode)라는 새로운 소프트웨어 아키텍처를 출현시켰다. 80286은 전원을 넣으면 이전의 8086과 같은 실제모드로 출발하여 하위 20비트의 주소선만을 사용하여 최대 1MByte까지의 메모리를 다룰 수 있었고, 이와 같이 실제모드에서 동작하는 80286은 단지 클록속도가 빨라진 8086과 같았으며, 과거 8086 소프트웨어가 아무런 수정 없이 돌아갈 수 있었다. 하지만 프로그램에서 보호모드의 전환을 수행하게 되면80286은 멀티태스킹 환경을 지원하게 된다. 이는 각 프로그램에 독립적인 일정한 양의 메모리를 할당할 수 있게 해주며 프.. 더보기
[CPU] 세그먼트 레지스터의 이용 프로그램이 수행되기 위해서는 여러 가지 메모리 주소가 필요하다. 우선 현재 수행되고 있는 명령어의 위치를 나타내는 값, 프로그램이 사용하는 데이터가 있는 메모리 값, 그리고 함수 호출 등을 위한 스택의 위치를 나타내는 값 등이다. 8086은 어드레스 버스가 20비트로 구성되어 있어서 1MByte까지 메모리 번지를 나타낼 수 있으나 8086에 있는 레지스터는 16비트밖에 되지 않아서 어떤 명령이 수행되어 메모리를 참조할 때에는 항상 다음의 표와 같이 암시적 또는 명시적으로 세그먼트 레지스터가 개입되게 된다. 세그먼트 오프셋 목적 코드 세그먼트(CS) IP 수행되어질 명령어의 위치 스택 세그먼트(SS) SP, BP 스택 주소 참조 데이터 세그먼트(DS) 범용 레지스터, DI, SI 데이터 주소 참조 보조 세.. 더보기