ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2022/03/23][짤막한 이야기 - 어셈블리어]
    카테고리 없음 2022. 3. 23. 18:29
    728x90
    반응형

    [2022/03/23][짤막한 이야기 - 어셈블리어]
    “어셈블리어(Assembly)”는 너무나도 잘 알려져있으면서도 또 공부하기 싫은 분야이기도 하다.
    오늘 포스팅 할 주제는 어셈블리어를 공부하라는 내용이 아니고, 어셈블리어의 특성 때문에 발생하는 분석 방해 기술이다.
    어셈블리어는 기계어(Machine Code, 보통 16진수로 표현함)를 “그나마” 사람이 읽기 편하게 조금 더 “번역”해놓은 컴퓨터용 언어에서 개선된 인간용 언어이다.
    어셈블리어는 일반적으로 옵코드(OpCode)와 오퍼랜드(Operand, 피연산자)로 나뉘어서 구성된다.
    그림에서의 첫 번째 줄을 예로 들면, 0x6A와 0x00이 각각 옵코드와 오퍼랜드인 것이다.
    두 번째 줄은 0x68이 옵코드이고 0x00 0x20 0x40 0x00이 오퍼랜드이다.
    디버거(혹은 디스어셈블러)에서는 이미 옵코드와 오퍼랜드를 구별할 수 있고, 이것을 띄어쓰기(0x3B 0xC6이 보이는가? 이는 오퍼랜드가 없고 옵코드만 있는 것이다.) 보로 잘 식별해 놓았다.
    그런데 Intel x86의 어셈블리어는 이 어셈블리어가 가변 길이(Variable Length)를 가지게 된다. 즉, 하나의 어셈블리어가 길이로 몇 바이트인지를 사전에 알 수 없는 것이다.
    대신, 어셈블리어는 항상 “결정적(Deterministic)”이면서 유일하기 때문에 다르게 디스어셈블 될 수 없고, 그렇게 되어서는 안된다.
    따라서 오퍼랜드의 길이가 얼마인지, 총 어셈블리어 길이가 얼마인지에 대한 정보도 옵코드에서 가지고 있게 된다. 왜 그런것인지는 조만간 포스팅할 압축 알고리즘, “허프만 코딩(Huffman Coding)”을 학습하면 알 수 있을 것이다.
    중요한 점은 랜덤하게 가변 길이의 어셈블리어를 채택하고 있기 때문에 앞선 포스트에서의 재동기화 현상이 발생하는 것이다.
    이렇게만 이야기하면 굉장히 모호한 이야기로 들리기 때문에 다르게 표현해 보겠다.
    즉, 고정 길이의 어셈블리어(항상 4바이트의 기계어를 하나의 어셈블리어로 디스어셈블하는 ARM 어셈블리어)의 경우 재동기화가 발생하지 않는다고 보면 된다.
    그리고 이러한 안티디스어셈블 현상을 이용하여 하나의 새로운 경로를 숨기는 “Instruction Embedding” 난독화를 구현할 수 있다.
    [관련된 짤막한 이야기 - 재동기화[2022/03/22]]
    [관련된 문서 - 핀툴 프로그래밍 기본서[제3부. 핀툴로 UPX 언패킹하기]]
    #이야기 #루니프 #핀 #핀툴 #디스어셈블 #어셈블리어 #CrackMe #안티디스어셈블 #재동기화 #프로그래머 #해커 #개발자 #분석가 #코딩

    728x90
    반응형
Designed by Tistory.