Assembly Basic Commands
데이터 타입BYTE : 8비트 부호 없는 정수SBYTE : 8비트 부호 있는 정수WORD : 16비트 부호 없는 정수SWORD : 16비트 부호 있는 정수DWORD : 32비트 부호 없는 정수SDWORD : 32비트 부호 있는 정수FWORD : 48비트 정수QWORD : 64비트 정수TBYTE : 80비트 정수 연산자(operand) 타입r8 : 8비트 범용 레지스터r16 : 16비트 범용 레지스터r32 : 32비트 범용 레지스터Reg : 임의의 범용 레지스터Sreg : 16비트 세그먼트 레지스터Imm : 8, 16, 32비트 상수imm8 : 8비트 상수imm16 : 16비트 상수imm32 : 32비트 상수r/m8 : 8비트 범용 레지스터 또는 8비트 메모리r/m16 : 16비트 범용 레지스터 또는 16..
2015.01.23
no image
PE File Format 0x04
IAT (Import Address Table)IAT란 쉽게 말하여 프로그램이 어떤 라이브러리에서 어떤함수를 사용하고 있는지를 기술한 테이블입니다. DLL (Dynamic Linked Library)동적 연결 라이브러리로 프로그램내에 라이브러리를 포함시키지 말고 별도의 파일(DLL)로 구성하여 필요할때마다 불러서 사용을 한다.일단 한번 로딩된 DLL의 코드, 리소스는 Memory Mapping 기술로 여러 Process에서 공유를 한다.라이브러리가 업데이트 되었을때 해당 DLL파일만 교체하면 되니 편리하다. DLL 로딩방식프로그램내에서 사용되는 순간에 로딩하고 사용이 끝나면 메모리에서 해제시키는 방법(Explicit Linking)과 프로그램 시작할때 같이 로딩되어 프로그램 종료할때 메모리에서 해제되는 ..
2015.01.13
IDA PRO 단축키
IDA PRO 단축키​Names ___________________________________ Shift+F4 Functions ________________________________ Shift+F3 Strings __________________________________ Shift+F12 Segments _________________________________ Shift+F7 Segment registers ___________________________ Shift+F8 Signatures ________________________________ Shift+F5 Type libraries _____________________________ Shift+F11 Structures ____..
2015.01.13
no image
PE FILE Format 0x03
Section Header //각 Section의 속성을 정의한 것앞에서 PE 파일은 code,data,resource 등이 각각의 section으로 저장이 된다했었습니다.code : 실행, 읽기 권한data : 비실행, 읽기, 쓰기resource : 비실행, 읽기 이러한 Secion 들의 속성을 나타내는 것이 바로 Section Header 입니다. IMAGE_SECTION_HEADERtypedef struct _IMAGE_SECTION_HEADER {...UNION {...DWORD VirualSize;}Misc;DWORD VitualAddress;DWORD SizeOfRawData;DWORD PointerToRawData;...DWORD Characteristice;} IMAGE_SECTION_HE..
2015.01.10
no image
PE FILE Format 0x02
NT HeaderIMAGE_NT_HEADERStypedef struct _IMAGE_NT_HEADERS {DWORD Signature; //PE Signature 50450000 ("PE"00)...} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;(*위의 구조체는 32bit용이며 64bit 용은 세번째 멤버가 IMAGE_NT_HEADERS64 입니다.) NT Header의 첫부분에는 "PE"라는 Signature가 나오며 이는 DOS Header에서의 "MZ"와 같이 필수적인 요소입니다. IMAGE_NT_HEADERS -IMAGE_FILE_HEADER //파일의 대략적인 속성을 나타내는 구조체typedef struct _IMAGE_FILE_HEADER {WORD Machine..
2015.01.09
no image
PE FILE Format 0x01
PE FILE의 구조PE HeaderDOS HeaderDOS stubNT headerSection headerPE Body코드데이터리소스 VA & RVAVA : 프로세스 가상 메모리의 절대주소RVA : ImageBase에서부터의 상대 주소를 말합니다.RVA + ImageBase = VA 파일에서는 offset 으로, 메모리에서는 VA(Virtual Address)로 위치를 표현합니다..PE Header의 끝부분과 각 Section들의 끝에는 NULL padding 영역이 존재한다. 컴퓨터는 파일, 메모리, 네트워크 패킷등을 처리할때 효율을 높이기 위해 최소 기본 단위 개념을 사용하는데 PE파일에도 같은 개념이 적용됩니다. PE HedaerDOS Headertypedef struct _IMAGE_DOS_H..
2015.01.08

데이터 타입


BYTE : 8비트 부호 없는 정수

SBYTE : 8비트 부호 있는 정수

WORD : 16비트 부호 없는 정수

SWORD : 16비트 부호 있는 정수

DWORD : 32비트 부호 없는 정수

SDWORD : 32비트 부호 있는 정수

FWORD : 48비트 정수

QWORD : 64비트 정수

TBYTE : 80비트 정수

 


연산자(operand) 타입


r8 : 8비트 범용 레지스터

r16 : 16비트 범용 레지스터

r32 : 32비트 범용 레지스터

Reg : 임의의 범용 레지스터

Sreg : 16비트 세그먼트 레지스터

Imm : 8, 16, 32비트 상수

imm8 : 8비트 상수

imm16 : 16비트 상수

imm32 : 32비트 상수

r/m8 : 8비트 범용 레지스터 또는 8비트 메모리

r/m16 : 16비트 범용 레지스터 또는 16비트 메모리

r/m32 : 32비트 범용 레지스터 또는 32비트 메모리

mem : 8, 16, 32 비트 메모리


 

명령어 (Command Destination,Source ) 



- ADD(add) : destination과 source를 더해 destination에 저장한다.

 

- SUB(Subtract) : destination에서 source값을 뺀 뒤 destination에 저장한다.

 

- SBB(Subtract with Borrow) : 하위 자리의 수계산 중에 빌림수를 가져갔다면 그것을

                                           감안해 뺄셈을 한다.

dst = dst - src - CF 식으로 생각하면 된다.

 

- MUL(Unsigned Integer Multiply) : 부호 없는 al, ax, eax의 값을 피연산자와 곱한다.

피연산자가 8비트 이면 al과 곱해서 ax에 저장되고 16비트이면 ax와 곱해서 dx:ax에 저장된다.

피연산자가 32비트 이면 EAX와 곱해서 EDX:EAX에 저장된다.

 

- IMUL(Integer Multiplication) : 부호 있는 al, ax, eax의 값을 피연산자와 곱한다.

결과에 따라 CF, OF가 달라질 수 있다.

피연산자가 8비트 이면 al과 곱해서 ax에 저장되고 16비트이면 ax와 곱해서 dx:ax에 저장된다.

피연산자가 32비트 이면 EAX와 곱해서 EDX:EAX에 저장된다.

결과에서 사용되는 비트 이외에 남은 비트를 부호비트로 채운다.

 

- DIV(Unsigned Integer Divide) : 8, 16, 32비트 부호 없는 값의 나눗셈을 한다.

ax/8bit 값 -> al:ah (몫:나머지)

dx:ax/16bit 값 -> ax:dx

edx:eax/32bit 값 -> eax:edx

결과에 따라 CF, OF, ZF가 세트될 수 있다.

 

- IDIV(Integer Divide) : 8, 16, 32비트 부호 있는 값의 나눗셈을 한다.

ax/8bit 값 -> al:ah (몫:나머지)

dx:ax/16bit 값 -> ax:dx

edx:eax/32bit 값 -> eax:edx

나눌 대상은 나눌 값보다 커야 한다. 부호 없는 경우는 xor연산을 해 0으로 초기화시키면서

확장을 시키고 부호 있는 경우 movsx 동작을 하는 CBW, CWD, CDQ로 부호비트로 채우면서

초기화 시켜서 나눗셈 연산을 수행한다.

 

- INC(Increase) : 피 연산자에 1을 더한다.

연산 결과에 따라 ZF나 OF가 세트 될 수 있다.

- DEC(decrease) : 피 연산자에 1을 뺀다.

연산 결과에 따라 ZF나 OF가 세트 될 수 있다.

 

- LEA(Load Effective Address) : source 의 주소값을 destination에 복사한다.

다시말해 간단히 source 주소값을 알아내서 destination에 복사하는 명령어라고 보면된다.

 

- MOV(Move data) : source 데이터를 destination으로 복사한다.

 

- MOVS(Move String) : source에서 destination으로 복사한다.

                                 문자열을 다루기 때문에 ESI와 EDI를 다룬다.

                                 따라서 ESI 안의 주소가 가리키는 문자열을 EDI 안의 주소가

                                 가리키는 곳으로 복사한다.

MOVS destination, Source

(MOVSB, MOVSW, MOVSD, MOVSQ : BYTE, WORD, DWORD, QWORD)

복사하는 단위마다 명령어가 다르다.

MOVSQ : 64비트에서 사용 가능한 명령어.

 

- MOVZX(Move with zero-Extend) : BYTE나 WORD크기의 피 연산자를 WORD나 DWORD

                                                   크기로 확장하고 남은 비트는 0으로 채운다.

 

- MOVSX(Move with Sign eXtend) : BYTE나 WORD 크기의 피연산자를 WORD나 DWORD

                                                    크기로 확장하고 부호는 그대로 유지한다.

                                                    다시 말해 나머지 공간을 부호비트로 채운다.

* movzx와 movsx의 차이점은 확장시 부호비트에 따라 값이 달라지기 때문에

확장시 확장된 공간을 부호비트로 채우거나 0으로 채우기 위해 두가지로 나뉘어 진다.

movxz - unsign , movsz - sing

 

- rep(repeat string) : ECX가 0이 될 때 까지 문자열 관련 명령을 반복시킨다.

                             문자열 관련 명령어는 MOVS, SCAS, STOS 등이 있다.

 

- repne(repeat until Not Equal) : 보통 SCAS명령어와 함께 쓰인다.

지정된 데이터 타입별로 문자열을 구분하고 한번 구분할 때마다 ECX를 -1 시킨다.

ZF가 1이거나 ECX가 0이 되기 전까지 반복한다.

시작 하는 순간 ECX를 -1 하고 시작한다.

 

- SCAS(Scan String) : 보통 REPNE REPE와 같이 사용된다.

                               Register와 Memory의 데이터 비교한다.

AL 또는 AX, EAX와 ES:(E)DI가 지시한 메모리 내용 비교 후 같은 값이면 ZF가 1로 세트된다.

scasb, scasw, scasd로 사용 한다.

자동으로 DF에 따라 EDI값이 달라진다.

 

- STOS(Store String) : AL, AX, EAX 안의 값을 EDI가 가리키는 곳으로 문자열을 저장시킨다.

Stosb, stosw, stosd로 사용되며 rep명령어와 함께 사용될 수도 있다.

DF에 따라 EDI 값이 + 또는 - 된다.

 

- LOOP : ECX가 0이 될 때 까지 정해진 라벨로 goto 한다.

디스 어셈블리 되면 라벨은 주소가 된다. 다시말해 라벨은 주소다.

또 loop label 을 디스 어셈블리 하면 loopd short 주소 이런 형식으로 나오는데

Loop를 사용하면 CX를 사용한다는 이야기이고 loopd는 ECX값을 사용한다는 이야기이다.

Short은 가까운 라벨을 찾겠다는 의미인데 별 뜻은 없다라고 난 생각한다.

 

- AND : 논리연산자 중 하나로 마스크 비트를 씌우는 동작을 한다.

예를 들면 네트워크에서 서브넷 마스크를 설정하면 네트워크 이름이 나오게 되는게

하나의 예이다.

 

- SAR(Shift Arithmetic Right) : SHR 명령을 사용하면 부호 비트가 변화하기 때문에 값이

                                            일정하게 바뀌지 않는다.

이때 사용 하는 것이 SAR인데 SHR은 무조건 오른쪽으로 비트를 밀어버리는 반면에

SAR은 오른쪽으로 비트를 밀고 기존의 부호 비트를 다시 MSB에 적용시킨다.

예를 들어 10110110 (-74)라는 비트를 SHR하면 01011011(91)이 되는데

만약 SAR하면 11011011(-37)이 된다.

neg : 음수값을 양수로 양수값을 음수로 바꿀때 사용

 

- TEST : 두 오퍼랜드값을 AND연산을 수행한다.

하지만 결과는 저장하지 않고 플래그 레지스터에만 영향을 준다.

대체적으로 TEST 명령 후 jmp 구문이 온다.

TEST는 CMP와 비교할 수 있는데 둘 다 비교 후 결과는 저장하지 않고

플레그 레지스터만 바꾼다.

예를 들어 if문을 사용할 때 비교 대상이 있을경우(if(a<10) 와 비교 대상이 없을경우(if(a))

가 있는데 비교 대상이 있을 경우는 cmp를 쓰고 비교 대상이 없을 경우는

현재 상태를 모르기 때문에 값이 뭔지 알아내기 위해서 TEST 명령어를 이용해 AND연산을

이용해 자신이 어떤 값인지 알아낸다.

보통 참인지 거짓인지를 알아내기 위해 사용한다.

OF와 CF는 항상 0으로 세트되고 TEST 연산 결과값이 0이면 ZF가 1로 세트되고

아니면 0으로 해제된다.

 

- CALL : 함수 호출 시 사용된다.

Jmp와 같이 프로그램의 실행 흐름을 변경 시키지만 jmp명령어와 다른 점은

돌아올 리턴 어드레스를 스택에 저장한다는 것이다.

 

-CMP : 두 오퍼랜드를 비교한다.

Destination 에서 source 를 묵시적으로 값을 빼서 비교한다.

두 피연산자의 값이 같다면 결과는 0이 되고 ZF가 1로 세트된다.

 

- OFFSET : 세그먼트 시작부터 변수가 위치한 거리까지 상대적인 거리를 리턴한다.

예를 들어 lea edi, offset value 하면 세그먼트로부터 value의 위치를 edi에 저장한다.

 

- NOP(No Operation) : 아무일도 하지 않는다.

필요에 따라 유용하게 사용하는데 예를 들면 추가적인 코드를 삽입시키고자 할 때

중간에 바로 삽입이 안되기 때문에 공간을 만들어야 한다.

이럴 때 필요없는 코드를 nop하면 그만큼의 공간을 확보할 수 있다.

 

조건 점프 명령



 JMP는 플래그 래지스터 값들을 이용해 조건이 만족하면 점프를 수행하게 되는 명령어이다.


JA(Jump if (unsigned) above) : CF = 0 and ZF = 0

JAE(Jump if (unsigned) above or equal) : CF = 0

JB(Jump if (unsigned) below) : CF = 1

JBE(Jump if (unsigned) below or equal) : CF = 1 or ZF = 1

JC(Jump if carry flag set) : CF = 1

JCXZ(Jump if CX is 0) : CX = 0

JE(Jump if equal) : ZF = 1

JECXZ(Jump if ECX is 0) : ECX = 0

JG(Jump if (signed) greater) : ZF = 0 and SF = 0

JGE(Jump if (singed) greater of equal) : SF = OF

JL(Jump if (signed) less) : SF != OF

JLE(Jump if (signed) less or equal) : ZF = 1 and OF != OF

JNA(Jump if (unsigned) not above) : CF = 1 or ZF = 1

JNAE(Jump if (unsigned) not above or equal) : CF = 1

JNB(Jump if (unsigned) not below) : CF = 0

JNBE(Jump if (unsigned) not below or equal) : CF = 0 and ZF = 0

JNC(Jump if carry flag not set) : CF = 0

JNE(Jump if not equal) : ZF = 0

JNG(Jump if (signed) not greater : ZF = 1 or SF != OF

JNGE(Jump if (signed) not greater or equal) : SF != OF

JNL(Jump if (signed) not less) : SF = OF

JNLE(Jump if (signed) not less or equal) : ZF = 0 and SF = OF

JNO(Jump if overflow flag not set) : OF = 0

JNP(Jump if parity flag not set) : PF = 0

JNS(Jump if sign flag not set) : SF = 0

JNZ(Jump if not zero) : ZF = 0

JO(Jump if overflow flag set) : OF = 1

JP(Jump if parity flag set) : PF = 1

JPE(Jump if parity is equal) : PF = 1

JPO(Jump if parity is odd) : PF = 0

JS(Jump if sign flag is set) : SF = 1

JZ(Jump is zero) : ZF = 1


 

부호 확장 명령어


부호 있는 나눗셈 연산을 할 시 나눌 대상이 되는 값은 나눌 값보다 커야 하기 때문에 확장을

시켜줘야 하는데 부호 있는 확장을 할 시 사용하는 명령어가 부호 확장 명령어 이다.

- CBW(Convert Byte to Word) : byte크기를 word 크기로 확장시킴

- CWD(Convert Word to Dword) : word크기를 dword 크기로 확장시킴

- CDQ(Convert Dword to Qword) : dword 크기를 qword 크기로 확장시킴

*동작은 movsx와 같고 개념은 초기화 개념으로 본다.

'Reversing > Theory' 카테고리의 다른 글

RVA to RAW 쉽게 생각해보기  (1) 2015.03.20
범용 CPU 레지스터  (1) 2015.03.04
PE File Format 0x04  (0) 2015.01.13
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10

PE File Format 0x04

Kail-KM
|2015. 1. 13. 04:24

IAT (Import Address Table)


IAT란 쉽게 말하여 프로그램이 어떤 라이브러리에서 어떤함수를 사용하고 있는지를 기술한 테이블입니다.


  • DLL (Dynamic Linked Library)

동적 연결 라이브러리로 프로그램내에 라이브러리를 포함시키지 말고 별도의 파일(DLL)로 구성하여 필요할때마다 불러서 사용을 한다.

일단 한번 로딩된 DLL의 코드, 리소스는 Memory Mapping 기술로 여러 Process에서 공유를 한다.

라이브러리가 업데이트 되었을때 해당 DLL파일만 교체하면 되니 편리하다.


  • DLL 로딩방식

프로그램내에서 사용되는 순간에 로딩하고 사용이 끝나면 메모리에서 해제시키는 방법(Explicit Linking) 프로그램 시작할때 같이 로딩되어 프로그램 종료할때 메모리에서 해제되는 방법(Implicit Linking)이 있다.

//IAT는 바로 Implicit Linkiing에 대하 메커니즘을 제공하는 역할을 한다.


아래는 notepad.exe의 kernel32.dll 의 CreateFileW를 호출하는 코드이다.


CreateFileW 를 호출 할때 직접호출하지 않고 128A0E4 주소에 있는 값을 가져와서 호출 한다. 따라서 76F4732C를 값으로 가져오는 것이다.(모든 API 호출은 이런방식이다.)  덤프에 kernel32.dll CreateFileW 함수의 주소값을 씌워 놓은 것이다.

76F4732C 주소가 바로 notepad.exe 프로세스 메모리에 로딩된 kernel32.dll의 CreateFileW 함수 주소이다.

모든 환경에서 CreateFileW 함수호출을 보장하기 위해서 컴파일러는128A0E4의 실제 주소(76F4732C)가 저장될 위치를 준비하고 CALL DWORD PTR DS:[128A0E4] 형식의 명령어를 적어두기만 하면 그 후 파일이 실행되는 순간 PE loader가 128A0E4의 위치에 CreateFileW의 주소를 입력해준다.


(DLL은 PE Header에 명시된 ImageBase에 로딩된디고 보장할수 없다. 반면에 process 생성 주체가 되는 EXE 파일은 자신의 ImageBase에 정확히 로딩이 된다.)



IMAGE_IMPORT_DESCRIPTOR                    //PE Body에 위치


PE파일은 자신이 어떤 라이브러리를 Import하고 있는지 IMAGE_IMPORT_DESCRIPTOR 구조체에 명시하고 있다.


  • Import : library으로부터 서비스(함수)를 제공받는 일
  • Export : library 입장에서 다른 PE 파일에게 서비스(함수)를 제공하는 일


일반적인 프로그램에서는 여러개의 Library를 Import하기 떄문에 Library의 수 많큼 위 구조체의 배열 형식으로 존재하게 되며, 구조체 배열의 마지막은 NULL 구조체로 끝난다.


  • OriginalFirstThunk : INT (Import Name Table)의 주소 (RVA)                //여기서 Table은 배열을 의미한다.
  • Name : Library 이름 문자열의 주소(RVA)
  • FirstThunk : IAT(Import Address Table)의 주소(RVA)

//INT와 IAT는 long type(4Byte) 배열이며 NULL로 끝난다.




EAT (Export Address Table)


windows 운영체제에서 라이브러리란 다른 프로그램에서 불러 쓸수 있도록 관련 함수들을 모아놓은 파일(DLL/SYS) 입니다.

EAT는 라이브러리 파일에서 제공하는 함수를 다른 프로그램에서 가져다 사용할수 있도록 해주는 메커니즘이며 IAT와 마찬가지로 PE 파일내 특정 구조체(IMAGE_EXPORT_EIRECTORY)에 정보를 저장하고 있으며 이 구조체는 PE파일에 하나만 존재한다.

*참고로 IAT를 설명하는 IID구조체는 여러개의 멤버를 가진 배열형탤 존재한다. 왜냐하면 PE파일은 여러개의 라이브러리를 동시에 Import할수 있기때문이다.





kernel32.dll은 export하는 모든함수에 이름이 존재하며, AddressOfNameOrdinals 배열의 값이 index = ordinal 형태로 되었습니다

하지만 모든 DLL파일이 이와 같지는 않습니다.export하는 함수중에 이름이 존재하지 않을수도 있으며AddressOfNameOrdinals 배열의 값이 index != ordinal 인 경우도 있습니다.


따라사 위 순서를 따라야만 정확한 함수 주소를 얻을수 있습니다.


**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다.  자세한건 Reversecore로 가시는게 더 좋습니다.

'Reversing > Theory' 카테고리의 다른 글

범용 CPU 레지스터  (1) 2015.03.04
Assembly Basic Commands  (0) 2015.01.23
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x02  (0) 2015.01.09

IDA PRO 단축키

Kail-KM
|2015. 1. 13. 00:25


IDA_Pro_Shortcuts.pdf


IDA PRO 단축키

Names ___________________________________ Shift+F4
Functions ________________________________ Shift+F3
Strings __________________________________ Shift+F12
Segments _________________________________ Shift+F7
Segment registers ___________________________ Shift+F8
Signatures ________________________________ Shift+F5
Type libraries _____________________________ Shift+F11
Structures _________________________________ Shift+F9
Enumerations ____________________________ Shift+F10



Data Format Options
ASCII strings style ____________________________ Alt+A
Setup data types ______________________________ Alt+D



File Operations
Parse C header file ___________________________ Ctrl+F9
Create ASM file ____________________________ Alt+F10
Save database _______________________________ Ctrl+W



Navigation
Jump to operand ______________________________ Enter
Jump in new window _______________________ Alt+Enter
Jump to previous position ________________________ Esc
Jump to next position ______________________ Ctrl+Enter
Jump to address _________________________________ G
Jump by name _______________________________ Ctrl+L
Jump to function _____________________________ Ctrl+P
Jump to segment _____________________________ Ctrl+S
Jump to segment register ______________________ Ctrl+G
Jump to problem ____________________________ Ctrl+Q
Jump to cross reference _______________________ Ctrl+X
Jump to xref to operand ___________________________ X
Jump to entry point __________________________ Ctrl+E
Mark Position _______________________________ Alt+M
Jump to marked position ______________________ Ctrl+M



Debugger
Star process ____________________________________ F9
Terminate process ___________________________ Ctrl+F2
Step into ______________________________________ F7
Step over ______________________________________ F8
Run until return _____________________________ Ctrl+F7
Run to cursor ___________________________________ F4


Breakpoints
Breakpoint list ___________________________ Ctrl+Alt+B


Watches
Delete watch __________________________________ Del


Tracing
Stack trace ______________________________ Ctrl+Alt+S


Search
Next code __________________________________ Alt+C
Next data __________________________________ Ctrl+D
Next explored _______________________________Ctrl+A
Next unexplored ____________________________ Ctrl+U
Immediate value ______________________________ Alt+I
Next immediate value _________________________ Ctrl+I
Text ______________________________________ Alt+T
Next text __________________________________ Ctrl+T
Sequence of bytes ____________________________ Alt+B
Next sequence of bytes _______________________ Ctrl+B
Not function ________________________________ Alt+U
Next void __________________________________ Ctrl+V
Error operand ______________________________ Ctrl+F


Graphing
Flow chart ____________________________________ F12
Function calls _____________________________ Ctrl+F12


Miscellaneous
Calculator _____________________________ Shift+/
Cycle through open views ________________ Ctrl+Tab
Select tab _________________________ Alt + [1…N]
Close current view ______________________ Ctrl+F4
Exit ___________________________________ Alt+X
IDC Command ________________________ Shift+F2


Edit (Data Types – etc)

Copy ____________________________________ Ctrl+Ins
Begin selection _______________________________ Alt+L
Manual instruction __________________________ Alt+F2
Code __________________________________________ C
Data __________________________________________ D
Struct variable _______________________________ Alt+Q
ASCII string ____________________________________ A
Array ______________________________________ Num *
Undefine ______________________________________ U
Rename _______________________________________ N


Operand Type
Offset (data segment) _____________________________ O
Offset (current segment) ______________________ Ctrl+O
Offset by (any segment) ________________________ Alt+R
Offset (user-defined) __________________________ Ctrl+R
Offset (struct) ___________________________________ T
Number (default) ____________________________ Shift+3
Hexadecimal ____________________________________ Q
Decimal _______________________________________ H
Binary _________________________________________ B
Character ______________________________________ R
Segment _______________________________________ S
Enum member __________________________________ M
Stack variable ___________________________________ K
Change sign ________________________________ Shift+-
Bitwise negate ______________________________ Shift+`
Manual ____________________________________ Alt+F1


Comments
Enter comment ______________________________ Shift+;
Enter repeatable comment __________________________ ;
Enter anterior lines ______________________________ Ins
Enter posterior lines ________________________ Shift+Ins
Insert predefined comment ___________________ Shift+F1


Segments
Edit segment ________________________________ Alt+S
Change segment register value __________________ Alt+G


Structs
Struct var __________________________________ Alt+Q
Force zero offset field ________________________ Ctrl+Z
Select union member __________________________ Alt+Y


Functions
Create function __________________________________ P
Edit function ________________________________ Alt+P
Set function end _________________________________ E
Stack variables ______________________________ Ctrl+K
Change stack pointer __________________________ Alt+K
Rename register _________________________________ V
Set function type _________________________________ Y​
 

'Reversing > Theory' 카테고리의 다른 글

Assembly Basic Commands  (0) 2015.01.23
PE File Format 0x04  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x02  (0) 2015.01.09
PE FILE Format 0x01  (0) 2015.01.08

PE FILE Format 0x03

Kail-KM
|2015. 1. 10. 01:37

Section Header                //각 Section의 속성을 정의한 것


앞에서 PE 파일은 code,data,resource 등이 각각의 section으로  저장이 된다했었습니다.

  • code : 실행, 읽기 권한
  • data : 비실행, 읽기, 쓰기
  • resource : 비실행, 읽기
           이러한 Secion 들의 속성을 나타내는 것이 바로 Section Header 입니다.


IMAGE_SECTION_HEADER


typedef struct _IMAGE_SECTION_HEADER {

...

UNION {

...

DWORD VirualSize;

}Misc;

DWORD VitualAddress;

DWORD SizeOfRawData;

DWORD PointerToRawData;

...

DWORD Characteristice;

} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;



  • VirtualSize : 메모리에서 섹션이 차지하는 크기
  • VirtualAddress : 메모리에서 섹션의 시작 주소 (RVA)
  • SizeOfRawData : 파일에서 섹션이 차지하는 크기
  • PointerToRawData: 파일에서 섹션의 시작위치
  • Characteristices: 섹션의 특징( bit OR)


                                     //VirtualAddress & PointerToRawData  //IMAGE_OPTIONAL_HEADER32에 정의된                                             SectionAlignment & FileAlignment에 맞게 결정이 된다.

Notepad.exe 의  Section Header를 보면 3개의 Section이 존재하는 것을 확인 할 수가 있습니다.





RVA to RAW                              //  각 섹션에서 메모리의 주소(RVA), 파일 옵셋(RAW)


PE파일이 메모리에 로딩되었을떄 각 섹션에서 메모리의 주소(RVA)와 파일옵셋(RAW)을 잘 매핑 할수 있어야한다.

이러한 매핑을 일반적으로 "RVA ro RAW"라 합니다.


How to?

1)RVA가 속해 있는 Section 찾기

2)비례식을 사용해서 파일 옵셋(RAW)을 계산한다,

   비례식

RAW -PointerToRawData = RVA - VirtualAddress

>>    RAW= RVA - VirtualAddress + PointerToRawData


//RVA to Raw 는 PE header를 공부할때 가장 기본이 되는 개념이므로 잘숙지해야한다.

  • RVA는 PE 파일이 메모리에 로딩되었을때의 메모리 주소를 의미하고, RAW는 PE 파일이 로딩되기 전의 File Offset을 의미

  • 즉, RVA to RAW는 PE File의 각 Section이 Memory에 로딩되기 전의 File Offset과 메모리에 로딩된 후의 위치주소를 매칭하는 것이다.



**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다.  자세한건 Reversecore로 가시는게 더 좋습니다.

'Reversing > Theory' 카테고리의 다른 글

PE File Format 0x04  (0) 2015.01.13
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x02  (0) 2015.01.09
PE FILE Format 0x01  (0) 2015.01.08
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?  (3) 2015.01.08

PE FILE Format 0x02

Kail-KM
|2015. 1. 9. 01:33

NT Header


IMAGE_NT_HEADERS


typedef struct _IMAGE_NT_HEADERS {

DWORD Signature;    //PE Signature

50450000 ("PE"00)

...} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

(*위의 구조체는 32bit용이며 64bit 용은 세번째 멤버가 IMAGE_NT_HEADERS64 입니다.)


NT Header의 첫부분에는 "PE"라는 Signature가 나오며 이는 DOS Header에서의 "MZ"와 같이 필수적인 요소입니다.






IMAGE_NT_HEADERS -IMAGE_FILE_HEADER         //파일의 대략적인 속성을 나타내는 구조체


typedef struct _IMAGE_FILE_HEADER {

WORD Machine;

WORD NumberOfSections;

...

WORD SizeOfOptionalHeader;

WORD Characteristics;

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;


  • Machine

CPU별로 고유한 값을 나타냅니다.

  • NumberOfSections

PE Body에서와 같이 PE파일은 Code,Data,Resource 등이 각각의 섹션에 나뉘어 저장이 되는데 그         섹션의 수를 나타냅니다. (0보다 커야함)

  • SizeOfOptionalHeader

IMAGE_OPTIONAL_HEADER32구조체의 크기를 나태냅니다.

*Windows의 PE Loader은 IMAGE_OPTIONAL_HEADER의 SizeOfOptionalHeader를 보고  IMAGE_OPTIONAL_HEADER32구조체의 크기를 인식합니다.

  • Characteristics;

파일의 속성을 나타내는 값입니다.


//Notepad.exe 의   IMAGE_FILE_HEADER






IMAGE_NT_HEADERS - IMAGE_OPTIONAL_HEADERS32    //64bit PE파일의 경우 64 사용


  • Magic

32bit의 경우 10Bh, 64bit의 경우 20Bh를 나타냅니다.


  • AddressOfEntryPoint

EP의 RVA(Relative Virtual Address)값을 가지고 있습니다.


  • ImageBase

-PE파일이 로딩(매핑)되는 시작주소를 나타냅니다.

-EXE,DLL 파일은 user memory 영역인 0~7FFFFFFFh 범위에 위치하고 SYS 파일은 kernel memory영역인 80000000h~FFFFFFFFh범위에 위치합니다.

-개발도구들이 만들어내는 EXE파일의 값은 00400000h이고, DLL파일의 값은 010000000h을              보통 사용합니다.

-PE loader는 PE 파일을실행시키기 위해 프로세스를 생성하고 파일을 메모리에 로딩(매핑)시킨후 EIP레지스터 값을 ImageBase+AddressOfEntryPoint 값으로 세팅합니다.


  • SectionAlignment & FileAlignment

SectionAlignment은 메모리에서 섹션의 최소단위를 나타내고 파일에서 섹션의 최소단위를 나태내는것이 FileAlignment 이다.


  • SizeOfImage

PE파일이 메모리에 로딩되었을떄 가상 메모리에서 PE Image가 차지하는 크기를 나타내며 일반적으로 파일의 크기와 메모리에 로딩된 크기는 다릅니다.


  • SizeOfHeader

PE Header의 전체크기를 나타낸다.


  • Subsystem

-Driver File(*.sys)

-GUI File : Graphic User Interface

-CUI File : Console User Interface


  • NumberOfRvaAndSize

DataDirectory 배열의 수를 나타내며 PE loader는 이 값을 보고 배열의 크기를 인식합니다.


  • DataDirectory

IMAGE_DATA_DIRECTORY 구조체의 배열로, 각 항목마다 정의된 값을 가지게 됩니다.

//Notepad.exe 의  IMAGE_OPTIONAL_HEADERS32



**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다.  자세한건 Reversecore로 가시는게 더 좋습니다.



'Reversing > Theory' 카테고리의 다른 글

PE File Format 0x04  (0) 2015.01.13
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x01  (0) 2015.01.08
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?  (3) 2015.01.08

PE FILE Format 0x01

Kail-KM
|2015. 1. 8. 03:23

PE FILE의 구조


  • PE Header

DOS Header

DOS stub

NT header

Section header

  • PE Body

코드

데이터

리소스






VA & RVA


VA : 프로세스 가상 메모리의 절대주소

RVA : ImageBase에서부터의 상대 주소를 말합니다.

RVA + ImageBase = VA


  • 파일에서는 offset 으로, 메모리에서는 VA(Virtual Address)로 위치를 표현합니다..
  • PE Header의 끝부분과 각 Section들의 끝에는 NULL padding 영역이 존재한다. 컴퓨터는 파일, 메모리, 네트워크 패킷등을 처리할때 효율을 높이기 위해 최소 기본 단위 개념을 사용하는데 PE파일에도 같은 개념이 적용됩니다.


PE Hedaer


DOS Header


typedef struct _IMAGE_DOS_HEADER {

WORD e_magic; //DOS signature : 4D5A("MZ")

...

...

LONG e_lfanew; //offset to NT header

}

    • 모든 PE 파일은 시작부분에 "MZ"가 필수적으로 존재
    •  e_lfanew가 가리키는 위치에 NT header의 OffSet이 표시

*NT header의 offset을 나타내는 E0는 Little-endian 방식이기에 000000E0로 읽어야 합니다.



DOS stub


Dos Header의 밑에 존재하며 필수적이지 않은 존재로 지워도 지장이 없습니다.

(사람에 비유하면 손톱과 같은 존재)

*붉게 표시된 부분16Bit 어셈블리명령어이기에  32bit 윈도우즈에서는 명령어가 실행되지 않는다

(PE파일로 인식되기에 무시된다.)

하지만 실행시킬수 있는 방법이 있는데 바로

*DOS환경에서 실행,

*DOS용 디버거를 이용해 실행가능(DOS EXE파일로 인식되기에)


즉,notepad.exe는 32bit용 PE파일이지만, DOS 환경에서 실행할 경우에도 같은 문자열이 출력이 된다.

다시말해 DOS환경에서는 16bit DOS용 코드가,Windows환경에서는 32bit Windows코드가 각각 실행된다.


**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다.  자세한건 Reversecore로 가시는게 더 좋습니다.


'Reversing > Theory' 카테고리의 다른 글

PE File Format 0x04  (0) 2015.01.13
IDA PRO 단축키  (0) 2015.01.13
PE FILE Format 0x03  (0) 2015.01.10
PE FILE Format 0x02  (0) 2015.01.09
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가?  (3) 2015.01.08