짤막한 이야기
-
[2021/09/23][짤막한 이야기 - 임포트 주소 테이블 복원(방법론)]짤막한 이야기 2021. 9. 23. 06:33
[2021/09/23][짤막한 이야기 - 임포트 주소 테이블 복원(방법론)] 패킹된 프로그램에서 IAT가 훼손되어있다면, 그 프로그램은 실행중에 자연스럽게 언패킹되면서 IAT를 복원하여야 한다. 혹은 IAT를 복원하지 않더라도 적어도 그 프로그램이 사용할 함수 주소를 어딘가에서 가져올 수 있어야 한다. 일반적으로 자주 사용되는 패커는 IAT를 자동으로 복원하기 위한 방법을 이미 프로그램 어딘가에 가지고 있다. 예를 들어, UPX 패커의 경우에도 IAT를 크게 훼손시키지만 언패킹이 완료되는 시점에서는 사용 함수 주소를 IAT 위치에 정확히 복원해낸다. 그리고 함수 주소는 "LoadLibraryA"와 "GetProcAddress"를 이용하여 획득하는 패커가 많다. 그리고 이것들 또한 함수이기 때문에 IAT에..
-
[2021/09/17][짤막한 이야기 - 임포트 주소 테이블(구성)]짤막한 이야기 2021. 9. 17. 06:34
[2021/09/17][짤막한 이야기 - 임포트 주소 테이블(구성)] IAT의 구성 방법 중 하나는 함수 이름으로 IAT를 구성하는 것이다. 이를 위해서는 사용할 함수의 이름을 프로그램 내에 별도로 저장하여야 하며, 해당 함수 이름이 저장된 주소를 IAT에 넣어주면 된다. 함수 이름이 정확하게 입력되었다면, 프로그램의 실행 과정 중 (함수 이름의 주소였던) IAT의 값이 함수의 시작 주소로 자동 변환된다. 다른 구성 방법은 함수 주소(함수의 시작 주소)를 IAT 위치에 저장하는 것이다. 가장 일반적으로 알려진 구성 방법이다. 마지막은 꽤 생소할 것인데, 함수의 서수를 IAT에 입력하는 것이다. 서수는 "첫번째, 두번째, 세번째..." 등을 의미하며, 여기서는 "특정 라이브러리의 X번째 함수"를 IAT에 ..
-
[2021/09/16][짤막한 이야기 - 임포트 주소 테이블]짤막한 이야기 2021. 9. 16. 06:22
[2021/09/16][짤막한 이야기 - 임포트 주소 테이블] "임포트 주소 테이블(Import Address Table, IAT)"은 Windows 실행파일(.exe)에서 사용할 함수 주소를 저장하는 테이블이다. 함수 주소와 함께 함수명도 확인할 수 있기 때문에, 정적 분석을 적용할 때 이 오브젝트를 확인함으로써 대략적인 기능성을 유추할 수 있다. 예를 들어, "FileOpen"이라는 함수의 주소가 IAT에 저장되어 있다면 이 프로그램은 특정 파일을 열어서 처리를 한다고 짐작하는 것이다. 그런데 패킹된 프로그램에서는 IAT가 상당부분 훼손된다. 물론 패킹된 코드가 언패킹 완료되기 전에는 프로그램 실행이 불가능한 것처럼, 훼손된 IAT만으로는 원본 프로그램의 기능성을 다 할수 없다. 따라서 언패킹을 연구..
-
[2021/09/15][짤막한 이야기 - 언패킹(개념)]짤막한 이야기 2021. 9. 15. 06:29
[2021/09/15][짤막한 이야기 - 언패킹(개념)] "언패킹"은 패킹된 프로그램을 원본 프로그램으로 복원하는 방법이다. 이 때, 패킹은 실행코드에 적용될 수도 있고 데이터에 적용될 수도 있는데, 보통 실행코드에 적용됨을 가정한다. 패킹된 코드의 언패킹은 결국 "메모리 쓰기"를 통하여 수행되기 때문에, 실행 권한이 있는 영역에 쓰기 행위가 수행되는 경우를 언패킹으로 가정하여 패킹 여부를 판별할 수 있다. 즉, 권한과 행위를 합하여 모니터링한 후 해당 행위가 종료되는 시점을 파악하는 것이 언패킹이 완료된 코드를 획득하는 방법이다. 보통 행위(언패킹)의 종료 시점은 행위가 시행된 위치(실행 권한이 있는 영역)로의 제어권 이동이 이루어지는 시점을 의미한다. 이를 파악한다면, 핀툴로 언패킹이 완료된 원본 오..
-
[2021/09/14][짤막한 이야기 - 최소 공통 조상(개선)]짤막한 이야기 2021. 9. 14. 06:20
[2021/09/14][짤막한 이야기 - 최소 공통 조상(개선)] ※ 해당 포스트는 분량 관계상 영문 버전이 제공되지 않습니다. 최소 공통 조상(LCA) 알고리즘은 “두 노드의 깊이 맞추기”와 “두 노드의 조상 맞추기”로 수행된다. 두 과정 모두 자신보다 위에 존재하는 노드로 올라가게 되는데, 트리의 높이가 매우 높다면 이 과정에서 많은 시간이 소요된다. 총 높이가 1,000,000인 트리에서 깊이도 1,000,000인 두 노드의 공통 조상을 찾는다고 생각해보자. 공교롭게도 공통 조상이 “루트(Root)”인 경우에는 1,000,000번을 올라가야 한다. 즉, 높이가 H인 트리에서의 최소 공통 조상 찾기 알고리즘은 시간 복잡도가 O(H)에 해당한다. 이를 개선하기 위해서는 높이를 1칸씩 올라가는 것이 아니..
-
[2021/09/13][짤막한 이야기 - 최소 공통 조상]짤막한 이야기 2021. 9. 13. 11:13
[2021/09/13][짤막한 이야기 - 최소 공통 조상] "최소 공통 조상(Lowest Common Ancestor, LCA)"이란 임의의 트리가 있을 때, 두 노드의 공통된 조상을 찾는 문제이다. 예를 들어 그림에서의 2와 6의 LCA는 1이고, 2와 5의 LCA는 2이다. 공통된 조상 중 가장 깊이가 깊은 조상을 찾으면 되는 문제로, 자기 자신이 최소 공통 조상의 답으로 도출될 수도 있다. 임의의 트리에서 수행되는 알고리즘이기 때문에, 알고리즘 수행 대상인 두 노드가 서로 다른 깊이에서 시작할 수 있다. 이 경우 같은 깊이가 될 때까지 깊은 쪽을 위로 올려주는 과정이 필요하다. 예를 들어 그림에서의 2와 6의 LCA를 찾기 위해서는 6을 4의 위치로 이동하여 깊이를 보정한다. 그 다음 두 노드의 값..
-
[2021/09/09][짤막한 이야기 - 예외]짤막한 이야기 2021. 9. 9. 06:32
[2021/09/09][짤막한 이야기 - 예외] "예외(Exception)"란 프로그램 실행 시 발생할 수 있는 예상하지 못한 상황을 의미한다. 프로그래밍 언어에서는 예외가 발생할 때에 실행될 구문을 미리 정의해두고, 예외가 발생하면 해당 구문을 실행할 수 있다. 예외 처리를 분석 도구를 탐지하기 위한 기능으로 활용할 수 있다. 이는 분석 도구에서의 프로그램 예외 처리 방법과 일반 환경에서의 처리 방법이 다르기 때문에 활용 가능한 탐지 기법이다. 분석 도구 내에서 예외가 발생할 경우 예외 처리용 구문을 실행하지 않고 예외 처리 방법을 분석 도구 자체에 맡기고 예외 상황을 건너뛰어버린다. 간단히 말하면, 동일한 프로그램이라도 분석 도구가 적용된 경우에는 구문을 실행하지 않고, 반대의 경우에는 구문이 실행되..
-
[2021/09/07][짤막한 이야기 - 분석방지 기술]짤막한 이야기 2021. 9. 7. 10:06
[2021/09/07][짤막한 이야기 - 분석방지 기술] "분석방지 기술(Anti-Analysis)"이란 소프트웨어 분석을 방해하는 기술이다. 이전에 언급한 "난독화(Obfuscation)"도 분석을 방해하지만, 조금은 개념이 다르다. 난독화는 코드를 읽기 어렵게하는 이른바 수동적인 보호 기술인데 반해, 분석방지 기술은 분석 도구를 "탐지(Detect)"하고 "대응(Response)"하는 능동적인 보호 기술이다. 탐지는 해당 분석 도구의 특성을 이용하여 수행하고, 탐지된 경우의 대응은 보통 자기자신(프로그램)을 강제로 종료하는 식으로 수행된다. 핀툴 또한 분석 도구이기 때문에 분석방지 기술에 의하여 방해받을 수 있으며, 이를 "핀툴방지 기술(Anti-PinTool)"이라고 한다. 물론 핀툴방지 기술 그 ..