ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2022/03/22][짤막한 이야기 - 재동기화]
    짤막한 이야기 2022. 3. 22. 13:51
    728x90
    반응형

    [2022/03/22][짤막한 이야기 - 재동기화]
    이번에 포스트할 내용은 어셈블리어나 디버깅에 익숙하지 않으면 생소할 수 있는 “재동기화(Resynchronization)”에 관한 내용이다.
    재동기화는 x86 어셈블리어에서 쉽게 관찰되는 특징으로, 이 특징이 있기 때문에 바이트 변형에 어느 정도는 내성을 가진다고 볼 수 있다.
    그림의 위 화면은 AbexCrackMe#1이라는 프로그램을 디버거로 분석하는 화면이다.
    그림의 아래 화면은 이 AbexCrackMe#1의 첫번째 바이트를 0x6A에서 0x6B로 1을 더하였을 때 발생하는 현상이다.
    위 화면에서는 첫 번째 줄에 “0x6A 0x00”의 2개 바이트를 합쳐서 “push 0”라는 명령어로 디스어셈블 되었다.
    그런데 아래 화면에서는 첫 번째 줄에 “0x6B 0x00 0x68”의 3개 바이트를 합쳐서 “imul eax, …”라는 명령어로 디스어셈블 되었다.
    아래 화면의 3번째 바이트인 0x68은 어디서 온 것일까?
    바로 위 화면의 두 번째 줄에 “0x68 0x00 0x20 0x40 0x00”에서 0x68만 위로 올라가서 함께 디스어셈블 된 것이다.
    그리고 아래 화면의 두 번째 줄 이후에는 add, inc, add, and와 같이 위 화면에서는 존재하지 않던 명령어가 등장하게 된다.
    이렇듯이 프로그램 내에 하나의 바이트가 변형되거나 중간에 하나의 바이트가 삽입되면 디스어셈블이 의도한 바와 다르게 전혀 엉뚱하게 될 수 있다.
    이것이 안티디스어셈블(Anti-Disassemble) 기술의 기초라고 지난 포스트에서 언급한 바 있다.
    그런데 잘 보면 위 화면에서의 4번째 줄(0x0040100C)과 아래 화면에서의 6번째 줄(0x0040100C) 이하부터는 어셈블리어가 다시 동일하게 되었다.
    이 현상이 바로 “재동기화”인 것이다.
    즉, 디스어셈블 과정을 방해받거나 자연적으로 실패하더라도 어느 정도 이후 부터는 다시금 의도한 대로의 디스어셈블을 수행할 수 있도록 동기화 되는 현상을 의미한다.
    이러한 현상은 왜 나타날까? 그 이유는 디스어셈블이 과정에서 요구되는 기계어(Machine Language)의 바이트 수를 잘 헤아려보면 금방 이해할 수 있다.
    [관련된 짤막한 이야기 - 안티디스어셈블[2021/02/24]]
    [관련된 문서 - 핀툴 프로그래밍 기본서[제3부. 핀툴로 UPX 언패킹하기]]
    #이야기 #루니프 #핀 #핀툴 #디스어셈블 #어셈블리어 #CrackMe #안티디스어셈블 #재동기화 #프로그래머 #해커 #개발자 #분석가 #코딩

    728x90
    반응형
Designed by Tistory.