본문 바로가기

CS/악성코드분석

[어셈블리어] 어셈블리어_범용 레지스터

어셈블리 언어 배우는 이유

예전에는 악성코드들이 어셈블리 언어로 작성되었다. 지금은 어셈블리어로 작성되지 않는다.

하지만 어셈블리 언어를 배우는 이유는 악성코드의 동작원리를 명확하게 알 수 있기 때문이다. 

 

예를 들어, 씨언어로 바이러스를 만든다고 하자, 정상적인 파일에 바이러스를 붙인다. 하지만 그냥 둔다면 정상적인 프로그램만 돌고 끝난다. 그렇기 때문에 흐름을 바꿔야한다. os는 바이러스를 먼저 실행하게 해야 한다 하지만 씨언어는 이러한 흐름을 바꿀 수 없다. 어셈블리 언어는 이것이 가능하다 씨언어로는 분석이 어렵다. 

⇒ 바이러스들을 분석하기 위한 기초 작업

바이러스는 다양한 언어(파이썬, 오랑지 등)으로 만들었다. 이에 기반이 되는 것이 어셈블리 언어이다.

 

진수 변환

어셈블리 언어 → 진수 변환 잘해야 한다 .

어셈블리 언어는 기본적으로 16진수로 한다.

 

범용 레지스터

어셈블리 언어 따로 변수 없음 → 범용 레지스터를 사용한다. (어떤 목적을 가지고 이미 설계되어 있음)

사용자의 커스터마이징된 변수를 사용하지 않고 이미 정해져있는 범용 레지스터를 사용한다.

  • 64비트로 악성코드 만들지 않음 → 32비트 운영체제에서 깔리지 않음
  • 그럼 16비트는? → 실행을 안시켜준다(완전 옛날 프로그램이기 때문에 호환성때문에 컴파일 안시켜준다.)
  • 32비트는 64비트가능, 32비트 가능이다.

 

 

EAX(Extended Accumulator Register)

 

= 곱셈과 나눗셈 명령어에서 자동으로 사용되고 함수의 리턴값이 저장되는 용도로 사용

  • 계산 관련

 

EBX (Extended Base Register)

= ESI 나 EDI와 결합하여 인덱스에 사용 (메모리의 특정 주소를 가리키기 위해서)

  • ESI = source index
  • EDI = destination index
  • 변수를 복사할 때 “source → destination” 방향으로 복사를 하라고 명령어를 쓴다.

그때 source의 위치와 destination의 위치를 각각 나타내기 위해서 사용

  • SI, DI 는 기본적으로 크기가 16비트(2byte)이다. 이는 (0~65535)까지 기술 가능→ 멀리 가게 하는 베이스가 필요하다. ⇒ “BX = 베이스를 지정하면 훨씬 더 멀리 갈 수 있다. “
  • 여기서 65535는 메모리에서 처음을 0으로 잡으면 64킬로바이트에 해당한다. 하지만 요즘 메모리들은 “기가 단위”로 나오므로 기가쪽에 있는 데이터를 다른 기가에 복사하고 싶은데 그게 안된다.

 

ECX (Extended Counter Register)

= 반복 명령어 사용시 반복 카운터로 사용

  • 반복문을 돌릴 때 카운트하는 용도로 사용
  • 씨언어에서 반복문을 돌 때 count하는 것과 비슷

 

EDX(Extended Data Register)

= 주로 EAX와 혼용하여 쓴다 그런데 부호 확장 명령

ex) Ax * Bx = 16bits * 16bits ⇒ 32비트 필요

가지고 있는 것은 16비트 레지스터 밖에 없음 그래서 곱셈을 할 때는 AX가 자동으로 참여한다 그리고 AX와 함께 DX를 확장하여 사용하므로 ” DX : AX “ 로 표현 (총 32비트 마련)

 

[ 8비트로 쪼개기 ] 

작은 용량을 사용할 경우 어떻게 하느냐? (씨언어도 char, int, double등 다양한 크기의 변수 존재)

범용 레지스터는 cpu안에 있음 그래서 변수들을 여러 개를 마련하는 공간이 아니라 연산을 하는 장치이기 때문에 다양하게 레지스터를 넣어둘 수 없다. ⇒ AX, BX, CX, DX를 반으로 쪼개서 사용하게

  • 하지만 SI와 DI는 쪼갤 수 없다.

 

[ 32비트로 확장하기 ]

16비트를 32비트로 확장 가능하다. → 운영체제가 그것을 지원해주는지에 대한 여부에 따라 달라진다.

 

[ 64비트의 사용성 ] 

RAX = 64비트로 확장

  • 악성코드 제작자가 많이 사용하지 않음반대로, 32비트는 32비트, 64비트 운영체제 가능
  • → 확장성이 떨어짐 → 64비트는 64비트 운영체제에서만 실행 가능

[ 그러면 16비트로 컴파일? ]

64비트 운영체제는 16비트를 컴파일 시켜주지 않는다. → 16비트는 옛날 프로그램이기 때문에 호환성의 문제가 생기므로 컴파일하지 않는다.

 

 

[ 메모리 공간 ] 

같은 메모리 공간 안에 있는 변수

위의 그림은 같은 메모리 공간임 

ex) AX에 0102를 넣었으면 AH, AL에 각각 01, 02가 자동적으로 들어감, EAX에 “XXXX 0102”가 들어감 → 같은 메모리 공간이기 때문

EAX 에서 앞쪽 XXXX은 알 수 없다