OllyDbg로 쉽게 디버깅하기 – Back to User 모드

OllyDbg는 Back to User 모드라는 기능을 지원하고 있습니다. 소스가 만 줄짜리인 프로그램을 처음부터 끝까지 맨땅에 헤딩하듯이 분석하기란 너무나 고달프기에, 이 Back to User 모드를 사용합니다. 이 기능을 사용하면 처음부터 분석할 필요 없이 디버깅을 하고 싶은 부분만 쉽게 찾아갈 수 있습니다.

Back to User 모드

예를 들여서 설명하죠.

사용자 삽입 이미지
Lenas Reversing for Newbies 강좌의 4번 째 문제 파일입니다. 등록되지 않은 사용자는 하나의 그룹당 4명의 정보까지만 저장할 수 있는 제약이 있죠. 하지만 Back to User 모드를 이용하여 쉽게 우회할 수 있습니다.

우선, OllyDbg로 프로그램을 불러온 다음 실행(F9)시킵니다. 그리고 위 그림처럼 디버깅하고 싶은 부분에서 프로세스가 멈추어져 있는 상태를 만듭니다. 메시지창을 띄운다던지, 사용자의 입력을 기다리던지 등으로요. 프로세스가 멈추어져 있지 않은 상태라면 Back to user 모드로 넘어가지 않고 단순히 Step over를 수행합니다. 꼭 프로세스가 멈추어져 있는 상태!!

5128165133.png

7908226673.png

2486973142.png


이제 디버깅을 일시정지(F12)합니다. 그러면 상태창에 Paused 라고 나오는데 이 상태에서 Execute till user code(Alt+F9)를 눌러 Back to user 모드로 들어갑니다. 성공하였으면 Back to user 라고 상태창에 나옵니다. 실패했으면? 그대로 Paused 이거나 Terminated 라고 나옵니다.

루틴 분석

사용자 삽입 이미지


Back to User 모드로 들어갔으면 아까의 메시지창에서 “확인” 버튼을 누릅니다. 그러면 OllyDbg가 알아서 마지막 함수의 call 이 끝난 지점을 찾아갑니다. 위 그림에서라면, MessageBoxA 함수가 call 되고 나서 그 다음 명령이죠. 즉, 이 지점 근처 어딘가에 등록 여부를 확인하거나 4명의 정보가 이미 저장되었는지 아닌지를 확인하는 어떤 루틴이 존재할 것이고, 우리가 원하지 않은 경우라면 MessageBoxA 함수를 call 한다는 것을 가정할 수 있습니다.

실제로 위 그림에서 0045631C 주소의 RETN 명령을 따라 가면, 아래 그림과 같은 루틴을 찾을 수 있습니다.

사용자 삽입 이미지
00412DD0 주소에서 어떤 변수와 4를 비교하는 것을 알 수 있는데, 이 부분이 이미 4명의 정보가 저장되었는지를 확인하는 루틴입니다. 우리는 여기서 우회를 함으로써 등록되지 않았지만 계속 정보를 추가할 수 있죠.

또 다른 예

또 다른 예를 보겠습니다.

#include <stdio.h>

int main (void)
{
     int input;
     
     printf ("Input >> ");
     scanf ("%d", &input);
     printf ("%d\n", input);
     
     return 0;
}


이런 프로그램을 만들어보죠. 콘솔의 경우에는 메시지창이 안 뜰테니 사용자의 입력을 받기 위해 프로세스가 멈추어져 있는 상태를 만들어야 합니다. scanf() 함수가 대표적이죠.

사용자 삽입 이미지
이 프로그램의 사용자 입력 부분에서 Back to User 모드로 들어가면 위 그림처럼 루틴이 나옵니다. 역시 sacnf() 함수가 call 되고나서 다음 명령을 가리키고 있습니다.

이처럼 Back to User 모드를 이용하면 디버깅을 하고 싶은 부분의 루틴을 쉽게 찾아갈 수 있습니다. 너무나 좋은 기능이죠. 하지만, 아쉽게도 프로세스가 멈추는 시점이 있어야 한다는 단점이 있어서 만능은 아닙니다. 그래도 왠만해서는 에러(혹은 경고) 메시지가 뜨는 경우가 많은니 충분히 유용할 겁니다. 잊어서는 안 될 것은, Back to User 모드를 이용하려면 프로세스가 멈춘 상태이어야 한다는 것! 꼭 기억하세요!

덧붙임

그런데 왜 모드 이름이 Back to User ??

Similar Posts

  • DumpFromOEP.py for Immunity Debugger

    Windows XP에서 Immunity Debugger의 플러그인들이 충돌을 일으켜서 만들었던 스크립트입니다. OllyDump의 소스코드를 보면서 만들었습니다. 단순히 메모리를 덤프해서 PE 헤더를 고친 후 파일로 출력하는 게 전부입니다. PyCommand 디렉토리 아래에 스크립트 파일을 저장한 후, eip가 OEP에 있을 때 커맨드라인에서 다음과 같이 입력하면 실행이 됩니다. !dumpfromoep [a path of the output file] OEP까지 직접 찾아가야 하고 IAT도 수동으로 고쳐줘야…

  • Hackarmy 백도어, IRC 봇넷에서 테스트

    백도어 분석하면서 IRC 서버 세팅해서 테스트해봤습니다. 아직 사용법이 익숙하지 않아서 기본적인 명령어 밖에는 할 줄 모르겠네요. [그림 1] IRC 봇넷 채널에서 명령을 내림 블랙햇은 IRC 채널에서 대기하고 있습니다. 혹은 원하는 시간에 접속을 하면 감염된 좀비들이 기다리고 있겠죠. 테스트라서 좀비는 하나 뿐이었습니다. “!morris tounge” 는 “내가 네 주인이다.”라고 알리는 주문입니다. 처음에 접속해서 이 주문을 안 외치면…

  • DLL Injection 은 어떻게 이루어지는가? – DLL? 그게 뭐야?

    루트킷을 비롯하여 바이러스, 악성코드 등 여러 분야에 두루 쓰이는 기법이 DLL Injection입니다. 윈도우즈 OS에 한정되어 적용되는 것이지만, 윈도우즈 자체의 점유율이 높은 이유로 아주 효과적으로 공격자가 원하는 작업을 수행할 수 있는 방법이죠. 최근 루트킷에 대해 공부하면서 이 DLL Injection이 어떻게 이루어지는 알게 된 것을 정리해봅니다. DLL? 그게 뭐야? DLL은 윈도우즈 OS에서 사용되는 동적 연결 라이브러리 실행…

  • Evan’s Debugger(EDB) Manual

    리눅스의 GUI 디버깅툴인 EDB의 매뉴얼입니다. 이 문서랑 동아리 선배의 Tor Project 문서 덕분에 2009 KISA 정보보호경진대회에서 최우수상 받고, HITB 말레이시아에도 참여할 수 있었네요. 윈도우즈의 OllyDbg와 유사하기 때문에 꽤 유용하게 쓰일 겁니다. 뭐, 요즘에는 Radare가 땡기긴 하네요… 매뉴얼 내용을 블로그에 모두 옮기려고 했는데, 이게 웬 삽질인가 싶어서 링크만 걸겠습니다. 이미 아는 분들도 계시겠지만, Articles에 문서가 업데이트…

  • 까막눈의 보안소식. 2010년 6월 1주차

    개인이 GSM 네트워크 망을 구축 http://www.mananet.net/gsm/ 이번 주 핫소식입니다. 어쩌면 국내 무선통신 환경과 보안에 관해 흥미로운 출발점이 될 지도 모르겠습니다. Hex-Rays ARM Decompiler v1.0 Comparison Page http://www.hex-rays.com/hexarm_compare0.shtml 사실, 이게 더 핫소식일지도… 이미 리버서들 사이에선 화제지요. 그런데 가격 크리가… HEXARM            ARM Decompiler Base License           2240 USD HEXARMADD…

  • CVE-2010-3970. Windows Thumbnail 취약점 데모영상

    작년 11월 Moti, Xu Hao의 POC 발표 이후로도 꽤 잠잠했던 Windows의 Thumbnail 취약점이 최근 이슈[^1]가 되었습니다. 그런데 발표가 있은 지 두 달이 다 되어가는데도 MS에서는 아직 패치를 안 내놓고 있네요. 아래 영상은 가상의 시나리오를 정한 후, Metasploit을 이용하여 원격제어 해킹을 하는 것을 녹화한 것입니다. HAURI의 분석자료[^2]가 상세하기 때문에 취약점에 대한 설명은 생략하겠습니다. Thumbnail 취약점이 Windows의…

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다