- 리버싱 강의
◇ 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