Reverse Engineering 30

[MASM] 문자열과 배열

1. 문자열 프리미티브 명령 ● 문자열 프리미티브(primitive) - 바이트, 워드, 더블워드의 배열 처리를 위한 Intel 명령 집합에는 5개의 그룹이 있으며, 이를 문자열 프리미티브라고 하지만, 문자 배열로만 국한되지 않는ㄴ다. - 문자열 명령어는 메모리를 참조하기 위해 ESI, EDI 레지스터를 참조한다. - ESI, EDI는 유일하게 단일 메모리 피연산자를 사용하여, 문자열과 배열의 처리에 특히 유용 - 보호모드에서는 ESI는 자동적으로 DS가 가리키는 세그먼트에서의 오프셋이 되고, EDI는 자동적으로 ES가 가리키는 세그먼트 내의 오프셋이 된다. - DS, ES는 항상 같은 값으로 설정되고, 이를 변경할 수 없다. ● 문자열 프리미티브(primitive) 명령 명령어 설명 MOVSB, MO..

[MASM] 고급프로시저 (지역변수 선언, 스택 매개변수, 디렉터리)

1. 지역변수 - 단일 프로시저 안에서 생성, 사용, 소멸되는 변수이다. - 지역 변수에 대한 제한된 엑세스는 디버깅할 때 도움을 준다. - 지역 벼수들은 메모리를 효과적으로 사용한다. - 같은 변수 이름은 이름 충돌을 일으키지 않는 한, 두 개 또는 그 이상의 프로시저들에서 나타낼 수 있다. - 지역 변수들은 실행 시 스택에서 생성한다. ● LOCAL 디렉티브 - LOCAL 디렉티브는 하나의 프로시저 내부에서 하나 또는 그 이상의 지역 변수들을 선언한다. - PROC 디렉티브 바로 다음 행에 위치해야 한다. - 지역 변수 사용시, 어셈블러에 의해 코드 생성 - LOCAL 디렉티브에 의한 지역변수 선언 BubbleSort PROC LOCAL temp : DWORD, SwapFlag : BYTE ret B..

[MASM] 어셈블리 언어(MASM)의 기초

이제 NASM에서 벗어나, MASM으로 들어간다. 문법적 차이는 존재하지만 그렇게 큰 차이는 존재하지 않는다. NASM의 경우 []를 제외한 특수기호가 안 쓰이지만, MASM은 그 규제가 유연하다. 또한 주소지정 방식에서 차이를 보인다. NASM MASM ● 데이터 저장 時 mov ax, [data] ● 주소 지정 時 mov ax, data ● 데이터 저장 時 mov ax, data ● 주소 지정 時 mov ax, offset data 이번 공부는 '09.07.15 당시 한국항공대학교 재학중이던 배건규 님의 자료를 참고한다. 쩝... 어셈블리 책 하나 사야겠다... 돈이 깨지는 소리가 들리는 군하;; 1. 어셈블리 언어의 기본적인 구성요소 ● 산술 연산 우선순위(Precedence) : 수식이 두 개 이..

[NASM] 구조체와 C++

1. 구조체 C에서 사용되는 구조체는 연관된 데이터를 하나의 변수에 보관하는 것이라 말할 수 있다. 이는 몇 가지 장점이 있다. ● 구조체에 정의된 데이터가 연관되어 있음을 보임으로써 코드를 명료하게 할 수 있다. ● 이를 통해 함수로의 데이터 전달을 단순하게 할 수 있다. 여러 개의 변수를 독립적으로 전달하는 대신에 이를 이용해 하나의 단위만 전달하면 된다. ● 이는 코드의 지역성(locality)을 향상시킨다. 어셈블리의 관점에서 볼 때 구조체는 원소들의 크기가 제각각인 배열로 볼 수 있다. 실제 배열의 원소들의 크기는 언제나 같은 형이자, 같은 크기여야 한다. 이를 통해 실제 배열에서는 배열의 시작 주소와 원소의 크기, 원소의 번째 수 만 알면 원소의 주소를 계산할 수 있게 된다. 그러나 구조체의 ..

[Reversing] CodeEngn BasicRCE Level4

[문제04] 이 프로그램은 디버거 프로그래을 탐지하는 기능을 갖고 있다.디버거를 탐지하는 함수의 이름은 무엇인가? 문제가 계속 왜 이런지 모르겠다... ㅇ_ㅇ;; 공부하려고 왔더니... 검색만 시키고 있다... 제대로 된 분석을 하고싶단 말이다... 이번은 그냥 검색할끄다... Syntax BOOL WINAPI IsDebuggerPresent(void); Parameters This function has no parameters. Return Value If the current process is running in the context of a debugger, the return value is nonzero. If the current process is not running in the con..

[Reversing] CodeEngn BasicRCE Level3

[문제03] 비주얼베이직에서 스트링 비교함수 이름은? Basic_L03.exe ㅇ_ㅇ;; 인터넷에서 찾아보려다가... 그래도 다운받을 수 있는 프로그램도 올려놨고 해서... 그냥 까보기로 한다... 이번에는 WinHex 프로그램을 사용했다. 코드를 살펴보면 왠지... 왠지 모르게... 이걸 비쥬얼베이직에서 사용할 것 같고... 스트링을 조작할 것 같고... 뭔가를 비교할 수 있을 것 같은... __vbaStrCmp() 라는 함수명이 눈에 띈다... [Visual Basic에서 쓰는데 String을 Compare합니다... 뭐 이렇게 말하는 함수려나...;;] 인증페이지에서 확인했더니... 되더라... 그냥 인터넷에서 찾아볼 것을 그랬나...;;;

[Reversing] CodeEngn BasicRCE Level2

[문제02] 패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오. Basic_L02.exe 문제에서 이미 제시하였지만, 다운받아서 실행하면 정말로 실행이 안된다. 많은 방법이 시도 될 것이지만, 아직 나의 한계로는 많은 방법이 떠오르지 않는다. 그래서 HexEditor를 이용하여 프로그램의 바이너리 코드를 확 까보기로 한다. HexEditor를 이용하여 문제의 실행파일을 까보면 다음의 함수를 호출하는 부분을 확인한다. Dialog를 불러오고, 끝내고, Dialog Text정보를 확인하고, 메세지 창을 띄우고... 각각의 역할을 맡는 함수들이 호출되지만 정확한 실행흐름의 파악이 되지 않는다. 조금 더 프로그램을 살피기 위해서 마우스 휠을 넘기답면 또 아래와 ..

[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과 같은 테크닉에서 사용될 수 있다. 그럼 이제부터 실제 기계어 코드가 어떻게 구성되어 있는지 본격저으로 알아보도록 할 것이며, 여기에서 다루는 기계어 코드는 인텔 마이크로프로세서 또는 그 호환 기종에 기반한 것이다. 인텔 마이크로프로세서는 아래와 같은 내용들이 묶여 하나의 명령어를 구성하게 되는데, 이들 요소는 그 명령어에 따라 존재하는 요소..