분류 전체보기
-
[2021/09/24][짤막한 이야기 - 임포트 주소 테이블 복원(예시)]짤막한 이야기 2021. 9. 24. 06:37
[2021/09/24][짤막한 이야기 - 임포트 주소 테이블 복원(예시)] 기본적으로 핀툴에서는 "메모리 쓰기" 중 4바이트 단위로 잘라내어 각 4바이트가 특정 함수의 주소에 해당하는지 판단하고, 해당 함수의 이름을 반환하는 API가 존재한다. "RTN_FindNameByAddress API"가 그것인데, 문제는 모든 함수를 올바르게 판단해주지는 못한다는 것이다. (즉, 안전성이 떨어진다.) 따라서 패킹된 프로그램의 IAT를 복원할 때, 위 PinTool API에 의존하는 것보다는 패커 자체적인 IAT 복원 방법을 역산하는 것이 더 타당하다. 이것이 언패킹 루틴 내의 "LoadLibraryA"와 "GetProcAddress" 함수를 이용하여 IAT를 복원하는 이유이다. 위 두 함수의 인자값과 반환값을 확..
-
[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:47
[2021/09/15][짤막한 공지 - 오픈채팅방 이벤트] 안녕하세요, 루니프입니다. 금일부로 “핀툴 프로그래밍 기본서[제1부. 헬로 핀툴 월드!]”를 무료배포하는 이벤트를 진행하려고 합니다. 루니프의 프로필 내 링크트리에서 “핀툴로 역공학 입문하기 (오픈챗) [Entering Reversing with PinTool (OpenChat)]”에 입장하신 후, 이메일로 오픈채팅 아이디를 보내주시면 됩니다. 오픈채팅방 내 인원들에게는 이미 제1부의 무료배포가 완료되었었는데, 이벤트로의 공지는 다소 늦은감이 있습니다. 핀툴 혹은 역공학 및 암호학에 대한 질문과 이야기도 언제든지 환영하오니 많은 참여 부탁드립니다. #공지 #루니프 #전자책 #오픈채팅방 #무료배포 #이벤트 [2021/09/15][Short Noti..
-
[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의 위치로 이동하여 깊이를 보정한다. 그 다음 두 노드의 값..