리버스 엔지니어링을 하면 알아야 할 어셈블리디스어셈블리 과정 

 

"리버스 엔지니어링, 밑바닥부터 시작하기 (4) " 까지 그동안 리버스 엔지니어링 과정에서 바로 코드 분석을 들어가서 문제에서 원하는 정답을 냈지만 교수님과 선배님께 물어보니 해당 방법으로 습관을 만들면 나중에 악성코드분석과 하드웨어 유지보수등 원하는 직종에 갔을 때 안 좋아지니 지금부터라도 리버싱 과정에서 어셈블리-> 디스어셈블리->바이너리분석 을 하면 더 좋게 성장할 수 있다 말씀하셔서 피드백을 수용하여 만든 카테고리이며, 그 과정을 만들 것이다.

 

디스어셈블리란 어셈블리어를 거꾸로 변환하여 바이너리코드로 만드는 과정이다.

또한 어셈블리어는 Ryzen(ARM), Intel(AT&T)등 회사에 따라 다 다르게 나오기에 주의해야 하지만, 대부분의 경우 비슷한 로직을 가지고 있다. 

 

x86 - 윈도우즈 운영체제가 동작하는 CPU의 총칭. , 32bit를 의미

x64 - 64bit 윈도우즈 운영체제가 동작하는 CPU의 총칭

ARM - 스마트폰, 태블릿PCCPU 코어 설계 회사

 

 

어셈블리에선 mov, add, jmp, push, call, ret 등을 이용하여 분석하지만 디스어셈블리에선 언어가 아닌 바이너리코드를 분석하는 과정을 말한다.  

 

이 과정에서  컴퓨터 구조와 메모리에 대해 알아가는 것이 현명한 방법이다. 

 

 

위 이미지는 프로그램을 리버싱 툴에 올려놓은 모습으로 메모리가 중간에서 이어주는 역할을 한다.

 

메모리를 자세히 확대하면 CODE, DATA, HEAP, STACK으로 볼 수가 있고 사람은 안보이지만 컴퓨터상 메모리는 한칸씩 주소를 지니고 있기에 이를 메모리 주소라 말하기도 한다. 

 

 

그렇다면 왜 바이너리로 분석하는가?  이는 3가지로 요약할 수 있다.


컴퓨터라 2진수로 표현이 가능하나, 너무 비효율적이고 데이터로 표현하기 까다롭게 길어짐

2자리의 16진수가 1byte2진수로 변환될 수 있기 때문에 정보를 표현하기 유용

RGB16진수 3개로 표현한 값 #96dfa5 와 같이 표현

 

레지스터 구조 및 과정

1.메모리 명령어를 입출력 버스로 이용하여 cpu로 이동 / 용어 : fetch

2.입출력 버스에서 버스 인터페이스, 명령어 공간에 가서 컨트롤 유닛으로 감/ 용어 : decode

3.컨트롤 유닛에서 산술논리장치(ALU)로 이동해서 처리한다. / 용어 : execution

 

레지스터는 EAX, EBX, EDX등을 말하는 것이며 어셈블리와 디스어셈블리를 할 때 자주 나오는 말이니 참고하면서 공부하는것이다. 

 

설명해준 레지스터를 잠시 말하면 아래와 같다.

 

EAX   

- 종료되는 상황에 값이 있으면 return 값을 의미한다.

ex) MOV EAX 10   -> Return 10

 

EDX

 - MUL, DIV(곱셈, 나눗셈) 값 저장 

ECX

 - 평소에는 그냥 계산 값

 - rep 명령이 있으면 반복 횟수로 변경

 

EBX

-메모리 주소의 위치

 


요약

 

어셈블리어는 개발하는 회사마다 천차만별

로직은 비슷함

디스어셈블리는 어셈블리의 역공학 

바이너리는 16진수 바이트

 

 

'Computer science > Disassemble' 카테고리의 다른 글

프로세서 레지스터(Processor Register) - 1  (2) 2023.11.09

+ Recent posts