'Reversing'에 해당되는 글 32건

  1. 2014.09.15 assembly in C
  2. 2014.09.11 The process of learning reversing and basic knowledge of lingoes
2014. 9. 15. 14:32
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

INC  -> operand 값을 1 증가 



인라인 어셈 - 상위레벨 언어에서 어셈 사용 가능하게 만들어줌 


int main(){


int a=0;

printf("%d\n",a);


_asm{

INC a

INC a

}


printf("%d\n",a);     //   2

return 0;


}




----------------


int main(){


int a=0;

printf("%d\n",a);


_asm{

INC a; INC a

}


printf("%d\n",a);     //   1

return 0;


}



// 한줄에 한 명령어 넣어 주는 게 좋음

// 소문자 명령어로 넣어도 됨 (inc...)




----------------


int main(){


int a=0;

printf("%d\n",a);


_asm{

INC [EBP-0x04]    // 주소로 접근

INC a

}


printf("%d\n",a);     //   2

return 0;


}


*stack frame의 기준점 EBP에서 -4(0x04)를 뺀 것


-------------


DEC  - 감소 (--)



int main(){


int a=2;

printf("%d\n",a);


_asm{

DEC a

DEC a

}


printf("%d\n",a);     //   0

return 0;


}



a -> mem 

reg -> EAX, EBX ...



---------------------



int main(){


int a=2;

_asm{

INC a

INC a

}



printf("%d\n",a);


_asm{

DEC a

DEC a

DEC a

DEC a

}


printf("%d\n",a);


return 0;


}



------------


ADD


int main(){

int a=0;

printf("%d\n",a);


_asm{

ADD a,0x05           // 10진수도 되지만 16진수로 사용하는 것을 연습

ADD a,0xa

}

printf("%d\n",a);        // 15

return 0;

}


* ADD mem, imm

Ex) ADD[EBP-0x0C],0x0A



--------------



int a=20;

printf("%d\n", a);


_asm{

SUB a, 0xf

}


printf("%d\n",a);      //   5

return 0;

}


-------------



int a=2;


_asm{

ADD a,0x03

SUB a,0x02

}


printf("%d\n", a);


return 0;

}




------------



MOV  - 값 복사 대입




int a=0;

printf("%d\n",a);


_asm{

MOV a,0x10

}


printf("%d\n",a);

return 0;


}



* MOV mem, mem    -> error, 메모리끼리는 안 됨




-----------





int a,b,c;


_asm{

MOV a,0x03

MOV b,0x05

MOV c,0xa


INC b

DEC c

MOV EAX,a

ADD EAX,b

MOV c,EAX


MOV EBX, a

SUB EBX,c

MOV b,EBX


}



printf("%d\n",a);

printf("%d\n",b);

printf("%d\n",c);


return 0;

}




















'Reversing' 카테고리의 다른 글

assembly lingoes and questions  (0) 2014.09.19
assembly lingoes  (0) 2014.09.18
assembly lingoes  (0) 2014.09.17
assembly lingoes and basic questions for practicing  (0) 2014.09.16
The process of learning reversing and basic knowledge of lingoes  (0) 2014.09.11
Posted by af334
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Packing - 실행 파일을 압축

unpacking  - 실행 파일을 압축해제 



dll injection 



--------


소스코드가 없는 실행 파일(... exe)의 소스를 파악해내는 기술


Assembly language -> 기계어와 1:1  대응 하는 언어 





소스코드    --- 컴파일 -->   어셈블리어   ----링크 --->  바이너리(exe)


소스코드   <---      --   어셈블리어   <---     ---  바이너리(exe)

                          (disassembler)




---------


- 바이너리 디버거 


OnllyDBG    -> 크랙미, 악성코드 동적분석


IDA Pro       -> 악성코드 정적 분석 (악성코드를 실행하지 않고 분석)

-> 그래프 뷰 제공 (전체적인 구조 파악 용이)


WinDBG       -> MS에서 만든 디버거, 

    커널 디버깅도 가능해서 조금더 강하지만 사용하기가 까다로움 

    -> 명령어 위주 인터페이스




---------



- 레지스터 


cpu에 있는 저장 공간

고속 저장 장치, 저장 공간 


process : HDD -> RAM  -> CPU 





- 32 bit 범용 레지스터


레지스터 -> 변수, 저장공간 이라고 생각하면 편함

             ->  +  특별한 용도


EAX  ->  산술 연산, 계산 저장공간     +     return 값을 저장하는  용도(알아서 들어옴)


EBX  -> 산술 연산 저장공간   +   간접 주소 지정시 사용    ex) JMP  1000   (1000번지로 점프)

  EBX   1000   ( EBX에 주소 저장)

  JMP    EBX  (간접 주소로 이용) 

 

ECX  ->  c는 count의 약자, 반복카운터를 지정할 때 사용 ex) ECX  5    (5번 반복) 

 -> 하나씩 차감이 됨

 -> ECX >0   (자동 전제)


EDX  ->  EAX의 보조 역할, EAX에 64bit로 넘어올때 EAX와 EDX로 분할하여 적용됨



-------


stack과 관련있는 레지스터


EBP -  스텍 프레임의 기준점 주소를 가지고 있음


ESP -  스텍 프레임의 최상단 주소를 가지고 있음, 위로 올라가면 주소는 낮아짐 



* 스텍 프레임  ->  함수를 호출할때마다 할당되는 영역



ex)    int a; 선언, 정리 시  -> EBP는 가만히 있고 ESP가 이동하여 영역을 할당함 



* stack은 높은 주소에서 낮은 주소로 자라감,

   높은 주소는 밑에 낮은 주소는 위에,

   ->  위치가 높아지면 주소는 낮아지는 구조 


   * heap과는 반대로 자라감


--------




주소를 저장하는 용도의 레지스터


ESI - S for source, 출발지의 주소를 담는 용도 


EDI  - D for destination, 목적지의 주소를 담는 용도 



---------


* 32 bit -> 4 byte



EAX -> 4 byte ,   E for extention


AX -> 2 byte 짜리, EAX를 반으로 자른 상태 


AH  -> 1 byte, AX를 반으로 자른후 상위 1바이트, H for high


AL  -> 1 byte, AX를 반으로 자른후 하위 1바이트, L for low




ECX -> 4 byte ,   E for extention


CX -> 2 byte 짜리, ECX를 반으로 자른 상태 


CH  -> 1 byte, CX를 반으로 자른후 상위 1바이트, H for high


CL  -> 1 byte, CX를 반으로 자른후 하위 1바이트, L for low






------------




EFLAGS  -> 상태값을 저장하는 용도의 레지스터, 2가지 상태를 가짐

  1 : set 되었다

  0 : clear 되었다 

  -> AF, CF(양수), OF(부호가 있을때),PF (홀짝), SF(부호 여부), 


***  ZF  ->  산술 연산 결과가 0이 되면 1로 set 됨      ***

ex) 1-1=0   -> 1로 set이 됨 

-> JMP할 때 주로 사용


EIP  ->  다음 실행될 명령어의 주소를 담고 있는 레지스터, 어디를 실행건지를 나타냄

       ->  디버깅할떄 나타나던 노란 화살표의 역할 

       -> I for Instruction



----------------



- 데이터 형식


int, char... 같은 형식은 없음


몇바이트씩 읽을 것인지만 관건


BYTE   ->  1 byte

WORD  ->  2 byte

DWORD   ->  4 byte, d for double


QWORD -> 8 byte, q for quad 



-----


- 차이 


IA -32  (인텔기반)

AT&T   



-------



ex)   ADD [EBP-0404], 0x01


ADD  : 명령어 (op코드)

[EBP-0404], 0x01     : 피연산자 (operand)


콤마(,)로 operand의 갯수 정함 





-----



표시기호 


mem : 메모리 

label : 지정된 레이블    // 소스코드에 이름을 지정하는 것 

{

    int a=0;

    goto L1;

    a=10;

    L1:

    printf("a : %d\n",a);

    return 0;

}


---------


{

    int a=0;

  L1:

    a=10;


    printf("a : %d\n",a);

    goto L1;

    return 0;

}                  //반복문 처럼 사용 가능





imm : immediately, 즉시 값, 쉽게 생각해서 상수 값 

reg : register, 범용 레지스터 



ex)   ADD [EBP-0404], 0x01

   -> reg가 아니라 mem으로 표현 가능 

      


ex)   ADD [EBP-0404], 0x01

   -> imm으로 표현 가능 -> 상수이기 때문






---------


64 bit 레지스터


RAX

RBX

RCX

RDX

....

...













'Reversing' 카테고리의 다른 글

assembly lingoes and questions  (0) 2014.09.19
assembly lingoes  (0) 2014.09.18
assembly lingoes  (0) 2014.09.17
assembly lingoes and basic questions for practicing  (0) 2014.09.16
assembly in C  (0) 2014.09.15
Posted by af334
이전버튼 1 2 3 4 이전버튼