ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2022/03/24][짤막한 이야기 - 직접분기문&간접분기문]
    짤막한 이야기 2022. 3. 24. 19:53
    728x90
    반응형

    [2022/03/24][짤막한 이야기 - 직접분기문&간접분기문]
    “분기문(Branch Statement)”은 대상이 되는 주소로 제어권을 이동하는 어셈블리어를 의미한다.
    이와 유사한(하지만 같지는 않은) 개념으로는 “호출문(Call Statement)”도 있다. 이 또한 대상이 되는 주소로 제어권을 이동하는 어셈블리어이다.
    흔히 잘 아는 분기문은 “jmp”와 같은 옵코드로 구성되고 호출문은 “call”과 같은 옵코드로 구성이 된다.
    그런데 프로그램 자체가 파일 상태에서 이미지 상태로 변환될 때, 즉, 하드디스크에서 메모리 상으로 적재될 때(=실행이 될 때)에는 그 적재 시작위치가 간간히 바뀔 수 있다고 하였다.
    그리고 특정한 라이브러리(DLL)로부터 API를 사용하는 경우 해당 라이브러리도 메모리 상에서 다른 위치에 적재될 수 있다.
    그렇기 때문에 API를 사용하는 경우라고 하더라도 모든 API의 시작주소를 직접적으로 결정하기 어려운 경우가 많다.
    대신 IAT(Import Address Table)라는 테이블에 API의 시작주소를 실행시작할 때 계산해서 결정할 수 있다.
    따라서 분기문의 경우 주소를 하드코딩해놓는 것이 아니라 실행 시점에서 계산하여 결정하는 경우도 존재한다.
    이 경우에는 직접분기문(분기 대상 주소가 숫자로 코딩되어 있음)을 활용하기 보다는 간접분기문(분기 대상 주소가 기록될 위치를 메모리 주소로 가지고 있음, 흔히 이야기하는 포인터)을 활용할 때가 많다.
    그림 우측 로그파일에서의 꺽쇠[]가 바로 포인터이자 간접주소를 나타내는 부분이다.
    이 경우 메모리에 적혀진 주소를 미리 파악하는 것이 어렵기 때문에 기본적으로 간접분기문이 많이 사용될 수록 해당 프로그램의 실행 방향을 예측하는 것이 어려워진다.
    이를 간단하게 말하면 프로그램의 엔트로피가 높아진다고 언급한다.
    그리고 프로그램의 실행 방향을 쉽게 결정할 수 없다는 특성은 프로그램 분석가의 입장에서는 이 프로그램을 분석할 수 있는 가능성이 낮아진다는 의미이다.
    따라서 이러한 특성이 크게 반영될수록 난독화된 프로그램으로써 생각할 수 있다. 
    [관련된 짤막한 이야기 - 난독화 지표[2022/03/08]]
    [관련된 문서 - 핀툴 프로그래밍 기본서[제3부. 핀툴로 UPX 언패킹하기]]
    #이야기 #루니프 #핀 #핀툴 #디스어셈블 #어셈블리어 #분기문 #호출문 #엔트로피 #난독화 #프로그래머 #해커 #개발자 #분석가 #코딩

    728x90
    반응형
Designed by Tistory.