본문으로 바로가기

어셈블리언어

category Security/리버싱 2017. 11. 27. 19:16

- 리버스 엔지니어링( Reverse Engineering, Reversing )

이진 코드로 되어 있는 실행 파일을 분석하려는 일련의 행위이다. 소프트웨어를 분석하고 동작을 해명해 나가는 것을 리버스 엔지니어링이라 부른다.

이것은 멀웨어에 한정되지 않고 일반적인 소프트웨어를 분석하는 것을 말하기 때문에 컴퓨터 보안과 관계가 없는 곳에서도 사용된다. 


- 리버스 엔지니어링의 종류

보안적 관점

소프트웨어를 개발 후 개발된 제품에 대해 암호화 알고리즘과 관련된 보안의 평가

해커들이 운영체제/애플리케이션의 취약점을 분석 후 바이러스 또는 악성코드를 제작하는데 사용

백신업체에서 바이러스 또는 악성코드를 분석 후 백신을 만들기 위해 사용

소프트웨어에서 사용된 암호화 알고리즘을 분석하기 위해 사용


개발적 관점

소프트웨어 개발시 필요한 지식을 습득하기 위해 다른 소프트웨어를 분석하는데 사용


- 법률적 제제

개인적인 필요에 의해서 프로그램을 수정하거나 변경할 수 있음

제 3자에게 정보를 제공하거나 유사 프로그램을 제작, 배포하는 행위는 위법


- 리버싱 분석 방법의 종류

정적 분석 : 대상 프로그램을 실행하지 않고 분석하는 방법 -> 전체적으로 넓게 분석 시 사용

동적 분석 : 대상 프로그램을 실행하여 분석하는 방법 -> 일부분을 집중적으로 분석 시 사용


- 디스어셈블러(Disassembler)

디스어셈블러는 기계어 0과 1을 어셈블리 코드로 변환하는 툴이다. 


- 디버거(Debuggers)

프로그램을 실행모드에서 분석

디스어셈블러의 기능을 포함하고, 프로그램을 진행시켜가며 하나씩 분석하는 것

- User Mode

(Windows) OllyDbg(GUI), IDA pro(GUI), Immunity Debugger

(   Linux  ) gdb(TUI), kdbg(GUI gdb), edb-debugger(GUI)

- Kernel Mode

(windows) WinDbg, SoftICE


- 어셈블리(Assembly) 구성

(Windows) Intel 문법 사용 : add ( Dst )   ( Src )

(  Linux   ) AT&T 문법 사용: add ( Src )   ( Dst )


- 오퍼랜드(operand)의 종류

명령의 대상이 되는 오퍼랜드는 3가지 종류가 있다. ( 레지스터, 메모리, 직접 값 )


- 명령(Opcode)의 종류

산술 연산 명령 종류    

데이터 전송 명령 종류

논리 연산 명령 종류

제어 전송 명령 종류    

스트링 명령 종류

프로세스 제어 명령 종류

( 모든 명령을 외울 순 없으니 외워야 하는 것만 외우자 )


- 산술 연산

add(Add) : 덧셈 명령, 캐리를 포함하지 않는 덧셈

sub(Subtract) : 캐리를 포함하지 않는 뺄셈

inc(Increment) : 오퍼랜드 값을 1만큼 증가한다.  (EX i++ )

dec(Decrement) : 오퍼랜드 값을 1만큼 감소한다. (EX i-- )

cmp(compare) : 두 오퍼랜드를 비교한다, 같으면 0  다르면 1 또는 -1을 리턴 


- 데이터 전송

mov(Move) : RAM -> CPU  / CPU -> RAM

push(Push) : 오퍼랜드의 내용을 스택에 넣는다.

pop(Pop) :  스택으로 부터 값을 빼낸다.

lea(Load Effective Address to Register) : RAM(주소의 값) -> CPU(Register) 유효주소를 레지스터로 로드,

 

RAM에서 CPU에 있는 레지스터에 데이터를 옮길때 로드(Load)

레지스터에서 RAM으로 가는 경우 저장(Store)


- 논리연산 

and(AND) : 비트가 둘다 1일때만 1

or(OR) : 비트 중 하나만 1이어도 1

xor(Exclusive OR) :  두개의 비트가 다를 때만 1

not(Invert) : 보수 


- 제어 전송

JMP(Unconditional Jump) : 프로그램을 실행할 주소 또는 라벨로 이동한다.  ( 무조건 점프 )

JE (Jump Equal) / JZ (Jump Zero) : 1과 같으면 점프

JNE (Jump not equal) / JNZ (Jump not zero) : 0과 같으면 점프

call(Call) : 함수 호출시 사용한다. 

PUSH(EIP) + JMP(Jump) 두 가지 기능을 하는 것으로 함수 호출 시 복귀 주소를 push하고 함수를 실행하고 저장해둔 주소로 점프한다. 

ret(Return) : 함수에서 Call한 위치로 돌아갈 때 사용한다. POP(EIP) + JMP(Jump) 의 두 가지 기능을 함





'Security > 리버싱' 카테고리의 다른 글

level 1 문제 해결 ( /bin/ExecuteMe 해석 )  (0) 2017.11.27
level 1 문제 해결  (0) 2017.11.27
GDB 사용법  (1) 2017.11.27
리버싱 실습환경 구성  (0) 2017.11.27
CPU와 매모리의 구조  (0) 2017.11.27