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

  • Evan’s Debugger(EDB) Manual

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

  • Reveal API Redirect on Themida

    일주일 전에 쿠시스 영남권 세미나에서 “API Redirect on Themida”라는 주제로 발표를 했었습니다. 아래는 그때 발표자료랑 시연에서 잠시 소개했던 스크립트입니다. Immunity Debugger 용으로 python으로 작성하였습니다. PyCommand 디렉토리 아래에 스크립트 파일을 저장한 후, eip가 call 문에 있을 때 커맨드라인에서 다음과 같이 입력하면 실행이 됩니다. !revealapi 이 스크립트는 call 문을 직접 실행하지 않고 Themida에서 리다이렉트된 API를 찾아서 comment로…

  • Brute Forcing with DLL Injection

    Articles에 문서를 업데이트 했습니다. 작년 10월, 2009 하반기 KUCIS 영남권 정보보호 세미나에서 발표했던 주제입니다. DLL Injection 기법을 이용한 무차별 대입 공격으로 패스워드를 찾아 보았습니다. 소스를 포함하여 문서를 정리할까 했는데, 악용될 소지가 있어서 발표했던 자료만 공개합니다. 당시에 발표했던 내용보다 조금 보완된 부분이 있습니다. 3개월째인 오늘까지도 이 방법을 어디에 써 먹을 수 있을지 못 찾고 있습니다. 간혹…

  • Windows Kernelmode, Keyboard Independent Keylogger

    Articles에 문서를 업데이트 했습니다. 곧 입대할 CERT-IS의 에잇(?)스, REDBIT(@RED_BIT) 군의 번역문서입니다. “후킹을 통한 키로거 제작방법. 기존의 필터드라이버나 혹은 그와 유사한 버스드라이버 등을 이용했을 경우에 발생하는 키보드 레이아웃 차이에 따른 호환성 문제를 해결한 키로거 제작방법이다. 하지만 이러한 방식은 안티키로거와 같은 프로그램의 특이성 때문에 실생활에서 인터넷뱅킹의 키 입력을 가로챌 수는 없겠지만, 추가적인 방법으로 충분히 데이터를 훔쳐낼 수…

  • DLL Injection 은 어떻게 이루어지는가? – AppInit_DLLs 값 조작

    AppInit_DLLs 값 조작 DLL Injection에는 여러 방법이 있습니다. 그중 루트킷에 이용되는 세 가지 방법을 알아보겠는데요. 첫 번째로 레지스트리를 조작하는 방법입니다. regedit에서 위 주소의 레지스트리 값을 확인해보면, 보통은 값이 비어있습니다. 그런데 어떠한 값이 들어있다면, 그리고 그것이 자신이 모르는 어떤 파일이라면, 그것은 악성 코드일 가능성이 있습니다. 이 레지스트리 값이 무엇이냐구요? 바로 이 값이 DLL Injection에 참조되는 레지스트리…

답글 남기기

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