본문 바로가기

Hacking/Reversing-

[1] 리버싱의 기초, 리버싱강의

- 리버싱 강의

 

 

 

 

 

◇ Reverse Code Engineering

- 라디오를 분해 하였을 때, 그 안의 부품을 알아야지만 분석을 할 수 있듯이,

프로그램의 안을 분해하여 보는 것이 Reverse Code Engineering 이다.

- 그렇기 때문에, 리버싱을 하려면 컴퓨터 구조에 대해서 알아야 한다.

 

 

◇ 컴퓨터 구조

- 컴퓨터는 하드웨어와 소프트웨어로 나누어 진다.

- 하드웨어 에는 [CPU], [주기억장치], [보조기억장치], [입'출력 장치] 가 있다.

- 소프트웨어 는 [응용프로그램] 과 [시스템프로그램] 으로 나누어 진다.

- 시스템 소프트웨어

: 하드웨어를 제어하기 위한 프로그램

: 운영체제, 컴파일러, 드라이버 등

- 응용 소프트웨어

: 특정한 업무 처리를 위해 만들어 진 프로그램

: MP3 Player 같은 프로그램, 워드프로세서 등

- 소프트웨어 = 프로그램, 프로그램 = 함수의 집합, 함수 = 명령어

- 고로 소프트웨어 는 명령어의 집합이다.

 

◇ 단위

- 데이터가 컴퓨터에 저장될때는 01000101110 와 같은 0과 1로 저장되는데,

- 컴퓨터는 어디까지가 명령이고, 어디까지가 데이터 인지 모르기 때문에

다음의 단위를 가지고 데이터를 끊어 읽는다.

(단위마다, 처리하는 방식이 다르기 때문에 단위는 매우 중요하다.)

- 1bit : 정보를 표현하는 최소 단위, (0과 1)

- 1Byte : 8bit

- 1Word : 16bit

- 1DoubleWord : 32bit

- 1QuaterWord : 64bit

 

◇ 진수 변환

1010

- Unsigned => 10

- Signed

( Signed 형은 맨앞의 비트를 부호비트로 인식한다, 0 = 양수, 1 = 음수 )

: 1010은 음수 이기 때문에 2의 보수로 변환해야 한다.

: 1010 -> 0101(1의보수) -> 0110 (+1) => -6

( 여기서 주의 할 점은, 맨앞의 부호비트는 2의보수로 변환한 후 에는 산술 비트로 변한다는 것)

▷ 1111

- Unsigned => 15

- Signed

: 1111 -> 0000 -> 0001 => -1

 

◇ 4비트 컴퓨터라 가정

11 + 9

: 1011 + 1001 = 10100 = 0100 => 4

( 4비트 컴퓨터니깐, 초과된 앞의 비트를 버린다. )

- 실제로 한도 이상 계산하면 결과가 깨지는 이유는 앞의 초과된 비트가 짤려서 이다.

5 - 3

: 5 + (-3)

: -3 => 0011 -> 1100 -> 1101

( -3 은 음수 이니 2의 보수를 취해야 한다 )

: 0101 + 1101 -> 10010 -> 0010 => 2

 

◇ 4비트 컴퓨터에 1씩 더한다고 가정

- Unsigned => 0 ~ 15

- Signed => -8 ~ 7

: 0000 = 0

: 0001 = 1

: 0010 = 2

: 0011 = 3

: 0100 = 4

: 0101 = 5

: 0110 = 6

: 0111 = 7

: 1000 -> 0111 -> 1000 -> -8

: 1001 -> 0110 -> 0111 -> -7

: 1010 -> 0101 -> 0110 -> -6

: 1011 -> 0100 -> 0101 -> -5

: 1100 -> 0011 -> 0100 -> -4

: 1101 -> 0010 -> 0011 -> -3

: 1110 -> 0001 -> 0010 -> -2

: 1111 -> 0000 -> 0001 -> -1

 

◇ 컴퓨터는 더하기만 할 수 있다?

- CPU안에는 감, 가산기가 있다.

- 즉 더하기뿐 아니라 빼기도 가능하다.

- 하지만 더하기로 계산 하는 것이 훨씬 효율이 좋기 때문에 더하기 로만 하는 것이다.

 

 

◇ Byte Ordering? Little Endian(리틀 엔디안), Big Endian(빅 엔디안)

- 이러한 정보들을 메모리에 저장 할 때는 저장하는 방식이 있다

- 리틀 엔디안 과 빅 엔디안은 데이터를 저장하는 순서이다.

( 단위는 Byte, 그렇기 때문에 Byte ordering 이라고 한다 )

- 12 34 56 78 (각각 1Byte, 총 32bit 를 메모리에 넣으면?)

: Big Endian 방식은 그대로 들어간다.

: Little Endian 방식은 78 56 34 12 순으로 들어간다.

( Byte 단위 이기 때문에 )

- 이 두가지 방식은, 메모리에 저장되는 순서만 다를 뿐이지 차이점이 없다.

- 하지만 굳이 차이점을 말하자면

: 다음과 같은 계산이 있다고 가정할때

: 97312

: +52681

: 계산 시 뒷자리 부터 계산한다. Little Endian 은 산술에 조금 더 강하다.

: 대, 소 비교시 맨 앞자리 부터 본다. Big Endian 은 대, 소 비교에 조금 더 강하다.

- 통신 시 에는 무조건 Big Endian 방식을 사용한다.

( 서로 통신이 되기 위해 Big Endian을 쓰자고 정해 높음 )

- 그렇기 때문에, Big Endian 방식을 사용하는 컴퓨터는 그냥 통신하지만,

Little Endian방식을 사용하는 컴퓨터는 Big Endian으로 바꿔준 후 전송하고, 바꾼 후 받아들인다.

- CPU Register 에는 바이트 오더링 성립이 안된다.

- CPU에 있는 데이터를 메모리에 저장할 때는 바이트 오더링이 성립된다.

( 즉 메모리에 들어갈 때만 바이트 오더링이 성립이 된다는 뜻이다 )

 

Post By : POWER HW 님

Write By. CISA