0. 머릿말


윈도우즈 해커, 가난한 리버서들을 위해서 쓸 만한 무료 리버싱 툴(디버깅 도구)을 소개합니다.


취미 정도로 조금씩 즐기는 아마추어 수준이지만, 리버싱할 때 개인적으로 쓸 만하다고 생각하는 도구들을 정리해 봤습니다.


1. IDA



프로그램을 분석할 때 0순위로 고려하는 정적 분석 도구입니다.


런타임(수행시간)에 치트엔진, x64dbg, ollydbg, windbg 같은 디버거를 붙여서 분석하는 방법도 있지만,


프로그램을 실행하기 전에 그 프로그램을 정적 분석하는 방법으로서, PE 구조체를 뜯어 보거나, 이런 도구로 디스어셈블을 할 수 있는 거에요.


일단 간에 IDA Pro 같은 정적 분석 툴로 해체할 수 있다면 해체하면 좋아요.


거의 완전하고 큰 밑그림을 제시하기 때문입니다.


프로그램이라는 엔진의 전체 작동의 도면이 쉽게 그려집니다.


하지만 수행시간이 되어 보지 않고는 알기 힘들게 만들어진 프로그램도 많기 때문에, 그곳이 이런 도구의 맹점이 됩니다.


예를 들어 패킹되어 있거나 분석하기 어렵게 프로텍트를 걸어놓은 바이너리는 그런 장치를 해제하지 않는 이상은 런타임 디버깅에 의존할 수밖에 없습니다.


저는 IDA는 잘 쓸 줄 모르는데, 보면 지원하는 플러그인도 많은 것 같고, 믿을 만한 소프트웨어라는 것은 인식하고 있습니다.


2. Cheat Engine (치트엔진)



다룰 줄만 안다면, 내가 아는 한 최고의 디버거입니다. 다른 디버거에 비해 기능이 많지는 않지만 반드시 필요한 알짜배기 기능들만 전부 들어가 있다고 할까요. 리버싱을 할 때 치트엔진이 제공하는 기능으로 안 되는 것을 하려고 한다면 뭔가 잘못하고 있을 가능성이 높다고 생각합니다.


치트엔진은 크게 보면 세 부분으로 나뉩니다. "메모리 스캐너"인 메인 윈도우(창), "메모리 뷰어" 윈도우(창), 눈에는 보이지 않는 "치트엔진 디버거"입니다. (그 이상으로도 곳곳에 숨어 있는 기능이 많지만 큰 그림만 보면 그렇습니다.)


1) 메모리 스캐너


치트엔진을 실행하면 나타나는 기본 윈도우인데, 이 기본 윈도우에서는 프로세스를 열고 값을 스캔(검색)하는 기능만 보입니다. 그리고 여기는 내가 볼 때 목적이 아니고 수단입니다. 무슨 뜻이냐면, 리버싱이 최종으로 목표하는 지점을 메모리 뷰어로 찾기 위해서 맨 처음에 거쳐가는 단계 정도 된다는 것입니다. 어셈블리 언어로 작동하는 거대한 프로그램을 런타임에 디버깅하려고 보면, 정말 뭘 어디서부터 시작해야 할지 모를 때가 있습니다. 그럴 때 메모리 스캐너에서 실마리를 잡은 다음, 자세한 분석을 지원하는 메모리 뷰어로 넘어가서 해당 지점 근처를 뒤져 보는 거에요. 이 프로그램의 개발자는 그런 유스케이스를 가장 일반적인 경우로 염두에 두고 치트엔진을 만든 것 같습니다. 메모리 스캐너로 값을 검색한다는 것은 리버싱의 좋은 진입점이 됩니다.


2) 메모리 뷰어


메모리 뷰어는 ollydbg나 x64dbg처럼 프로세스의 가상메모리를 전부 열어서 보여 주고 그냥 일반적인 런타임 디버거 UI를 제공합니다. 그 UI는 다른 디버거 프로그램들에 비하면 비교적 직관적이고 단순한 편이에요. 샅샅이 낱낱이 전부 보여 주지는 않지만 쓸 데 없는 것들 빼고 꼭 필요한 것만 다 보여 준다는 느낌이네요. 저는 메모리 뷰어 윈도우 상단 메뉴에 있는 기능 전부랑, 마우스 우클릭 옵션 메뉴에서 제공되는 기능을 전부 이용해요. 그리고 그 가운데 쓸모 없는 기능은 단 한 가지도 없다고 단언할 수 있습니다. 디스어셈블리 분석을 하나부터 열까지 다 해 주고, 뭐든지 주소 찾기 쉽게 UI 표현을 잘 해 놓았습니다. 메모리 뷰어가 치트엔진의 핵심이에요.


3) 치트엔진 디버거


이것을 인식하는 순간은 치트엔진이 '이 동작을 하신다면 디버거를 붙이겠습니다.' 하고 알림을 줄 때 뿐입니다. 치트엔진 디버거는 내가 생각하기에 '뭔가 브포를 거는 것'이네요. 어떤 인스트럭션이 언제 어디에 어떤 상태로 메모리를 접근하는지 찍어 보는 기능이랑, 디버그 스트링 출력 따위를 지원합니다. 주의할 점은 어딘가에 디버거를 붙였으면 그곳에 대한 분석이 끝난 뒤에는 브포를 꼭 풀어 줘야 한다는 거에요. (Stop 버튼을 누르거나 메모리 뷰어로 브포를 찾아서 토글하거나.)


3. x64dbg



[ollydbg의 후계자]


x64dbg 이건 한 마디로 'ollydbg 같은 것'이라고 할 수 있습니다.


ollydbg는 windbg와 더불어 리버스 엔지니어링 세계의 전설의 레전드로 손꼽히는 디버거였습니다.


요즘 인터넷으로 공인인증서 뭐시기 하는 것들 할 때 마지 못해 설치하는 보안 솔루션들 있는데 그것들 보면 ollydbg 감지해서 켤 수도 없게 붙잡고 차단해 버리더라고요.


ollydbg가 그 정도로 유명하고 아주 명성이 자자해요.


그런데, 최근 컴퓨팅의 생태계가 32비트에서 64비트 환경으로 급격하게 변하면서 그 대단한 ollydbg도 그대로 그냥 한물 가 버렸네요.


ollydbg가 x86만 지원하고 그 이후 업데이트가 잘 없었거든요.


역사의 뒤안길로 사라진 이 비운의 프로그램의 대체재로서 요즘 인기 있는 프로그램이 x64dbg입니다.


x64dbg도 ollydbg처럼 뜻 있는 개발자들이 모여서 약간은 취미로 그리고 오픈소스로 개발하고 있는 것 같습니다.[각주:1]


[쓰임새]


개인적으로 이런 디버거는 치트엔진으로 안 되는 자세한 기능이 필요할 때만 씁니다.


x64dbg를 저는 어떤 용도로 쓰냐고 하면 '정렬'인데요.


뭔가 엄청나게 많은 것들을 깨알 같은 글자로 자세하게 한 번에 많이 볼 수 있게 쭉 정렬해 놓고 필요한 곳을 도막도막 잘라서 찍어 본다는 느낌으로 쓰고 있습니다.


특정한 함수나 모듈이나 데이터를 왕창 모아서 종류별로 정렬해서 보고 그 수많은 지점에 브포를 걸었다 풀었다 한다던지 하는 식으로요.


치트엔진만으로는 그런 것은 하기 힘들거든요.


4. 맺음말


이상에서 소개한 IDA, 치트엔진, x64dbg 이 셋을 다루는 것은 리버싱의 정석이나 다름 없습니다.


이런 툴로 프로그램을 해체할 때 올바른 조언이라고 생각하는 것은, 프로그램을 낱낱이 알려고 하지 말고 관심 있는 API나 이벤트/메시지 등을 중심으로만 뒤져보는 것이 보통 바람직한 리버싱의 방식이라는 것입니다.


디버깅을 전문적인 업으로 삼지 않는 사람 입장에서 너무 깊이 들어가는 것은 피곤하니까요.



  1. https://github.com/x64dbg/x64dbg [본문으로]
Top