유저모드 디버거하면 바로 가장 유명한 올리디버거(OllyDBG)가 있죠. 요즘은 x64dbg도 많이 쓰이는것 같습니다.


올리디버거 플러그인 중에 프로그램이 실행되면 자동으로 어태치시켜주고 어태치하는 시간도 설정할 수 있는 유용한 툴이 있죠

바로 AutoAttach 라는 플러그인 입니다.




About 매뉴는 제작자에 관한 메뉴라 눌러보실 필요 없고


Set process name 은 어태치할 프로세스명을 설정하는 칸입니다. 여기서 설정한 이름의 프로세스가 있으면 바로 어태치 시킵니다.


Set delay time은 Set process name에서 설정한 프로세스 발견시 얼마나 딜레이(밀리세컨드)를 주고 어태치 시킬지 설정하는 매뉴입니다.


하지만 이 툴의 단점이 있으니 바로 




확장자가 .xem같이 exe로 끝나지 않는 프로그램은 어태치 시키지 못한다는 것입니다.


일반적인 프로그램은 대부분 .exe로 되어있지만 


보안프로그램이나 악성코드, 게임핵툴의 경우 탐지/분석을 회피하기 위해 특수한 확장자명으로 되어있는 경우가 많습니다.




위와 같이 프로세스 명을 적고 해당 프로세스를 실행해도 어태치가 되지 않습니다.


다시 한번 Set process name 매뉴에 가보면





위 그림과 같이 내가 적은 프로세스명 뒤에 자동으로 + .exe 문자열을 붙여주는것을 확인 할 수 있습니다.


자 그럼 이것을 한번 수정해 보도록 하겠습니다.


아주 쉽고 간단하니 편하게 따라오시기 바랍니다.


IDA Hexray로 한번 대략적으로 플로그인 모듈을 살펴보도록 하겠습니다.





여러 함수가 보이는데 하나하나 살펴보다 보니 _ODBG_PluginMainloop에 주요 소스가 있는것을 확인 할 수 있습니다.


.exe를 붙인다는것을 감안해서 문자열 보기 (shift + f12)를 통해 찾아가셔도 좋습니다.





.exe 문자열을 찾고 그와 관련된 작업을 하는것을 알 수 있습니다.


여기서 분석가능하신 분도 계시겠지만 더 쉽게 툴의 힘을 빌려 f5를 눌러줍니다.






HexRay의 위엄... 거의 원본 소스 상태로 보여줍니다.


strstr 함수를 사용해서 사용자가 입력한 프로세스명이 .exe를 포함하지 않으면 뒤에 .exe를 붙여주는 코드가 있습니다.


이 코드때문에 .xem 파일을 어태치 할 수 없었습니다. 저 부분을 nop처리 하면 가뿐히 해결될걸로 보이네요.


수정은 OllyDBG로 해보도록 하겠습니다.







플러그인을 넣은 올리디버그를 실행하고 하나 더 실행해서 첫번째 실행한 올리디버그를 어태치 시켜줍니다.(올리디버그를 올리디버그로 어태치)


모듈 목록에 AutoAttach.dll이 보입니다.





문자열 검색을 해보니 역시나 .exe 부분이 나옵니다. 저기로 이동





exe가 있는지 비교하는 부분이 보이네요. 저 JNZ를 무조건 점프시키는 JMP로 변경하면 해결되겠네요.





이렇게 변경시킨뒤 파일로 저장합니다. 


저장법은 우클릭 -> Copy to executable -> All modifications


다음 save file로 저장해줍니다.


이렇게 변경한 플러그인으로 실행하면 







잘 어태치 되는것을 확인 할 수 있습니다.



원본 파일과 수정한 두 파일을 첨부해 놓겠습니다.


AutoAttach.dll

AutoAttach_m.dll


불친절한 설명을 읽어주셔서 감사합니다.


 



WinDBG 명령어 정리

 

명령어

옵션

설명

 일반명령어

u

Unassemble

 

언어셈블

f

함수 전체 언어셈블

b

언어셈블(ip이전의 8개 명령어)

bl

BreakPoint List

 

브레이크 포인트 리스트 출력

be

BreakPoint enable

 

브레이크 포인트 활성화

bd

BreakPoint Disable

 

브레이크 포인트 비활성화

bc

BreakPoint Clear

 

브레이크 포인트 모두 제거

ba

BreakPoint On Access

 

특정 주소에 access시 브레이크포인트

bp

Set BreakPoint

 

브레이크 포인트 설정

g

go

 

실행

p

step

 

한 단계씩 실행

pc

step to next call

 

다음 call 까지 실행

d

Display 

b : byte 출력

출력

dw : word 출력

dd : double word로 출력

dq : Quad word 로 출력

ds

Display String

 

문자열 출력

r register

 

레지스터 정보 출력

k

call stack

 

콜스택정보 출력

 

 

p

함수정보 출력

 

 

b

인자표시

 

 

n

프레임 번호

 

 

v

FPO 정보 표시

 

 

f

스택 사용량 표시

lm

loaded module

 

로드된  모듈 표시

F9

 

 

Start

F5

 

 

Break

메타 명령어

.cls

 

 

커맨드 창의 내용 지우기

.attach

 

 

대상 프로세스에 어태치

.bugcheck

 

 

버그 내용 표시

.crash

 

 

강제로 크래쉬 발생
.dump

 

 

dump 파일 생성

.reboot

 

 

재부팅

.cxr

 

 

context record 표시

.exr

 

 

exception record 표시

.excxr

 

 

exception context record 표시

.trap

 

 

Trap Frame 표시

.exepath

 

 

실행파일 경로설정

.srcpath

 

 

소스파일 경로 설정

.sympath

 

 

심볼 패스 설정/확인

.symfix

 

 

MS 심볼경로 설정

.reload

 

 

심볼 경로를 설정한 후에 WinDBG가 심볼을 다시 로드

.load

 

 

dll 로드

확장 명령어 

!process

 

 

현재 또는 실행중인 모든 프로세스의 정보 출력

!gle

 

 

GetLastError 출력

!error

 

 

에러 코드 해석

!analyze      자동 분석
!cpuid       cpu 정보 출력

!peb

     peb(process environment block) 정보 출력

!teb

     teb((thread environment block) 정보 출력
!token      security token 정보 출력

!stack

     현재 커널 스택 정보 출력

!drivers

     로드된 드라이버 정보 출력


유져 디버깅은 올리디버그나 x64디버그가 편하지만 덤프 분석이나 커널디버깅시 유일신인 WinDBG

WinDBG의 자주쓰이는 명령어 위주로 정리해 보았습니다.

기능별 주요 API

 

 

프로그램 실행관련
WinExec : 프로세스 생성하고 초기화가 다 될때까지 기다렸다가 리턴함. 내부적으로 CreateProcess 호출

CreateProcess : 프로세스 생성 후 곧바로 리턴함 

ShellExecute :

LoadModule : 모듈 로드(dll)

입력관련
keybd_event : 키 입력

mouse_event : 마우스 입력

SendInput : 키 입력
SendMessage : 키 입력

PostMessage : 키 입력

 WaitforInputIdle : 사용자 입력 받을수 있을때가지 기다리는 함수

프로세스 종료
TerminateProcess : 프로세스 종료 (작업관리자(taskmgr)에서 응용프로그램탭의 작업 끝내기도 ZwTerminateProcess 호출됨)
ExitProcess : 프로세스 종료 (내부적으로 TerminateProcess 호출됨)


파일 관련 

CreateFile : 파일생성, 파일열기
URLDownloadToFile : 파일 다운
DeleteFile : 파일 삭제

DeleteDirectory : 폴더 삭제

PathFileExists : 파일 존재 검사

FindFirstFile : 파일 찾기

GetfileAttributes : 파일 정보 얻기

ini 파일 

GetPrivateProfileInt : ini 값 일기(숫자)
GetPrivateProfileString : ini 값 읽기(문자열)
WritePrivateProfileString : ini값 쓰기(숫자)
WriteProtfileString : ini값 쓰기(문자열)

Registry 관련

RegCreateKeyEx
RegSetValueEx
RegQureyValueEx
RegOpenkeyEx
RegCloseKey
RegQueryInforkey

드라이버 관련 
NtDeviceIoControlFile :

ZwDeviceIoControlFile :

명령인수
GetCommandLine() : 명령인수 가져오기


디버깅 관련
IsDebuggerPresent : 디버깅중인지 검사

NtQueryinformationProcess = 디버깅 중인지 검사 CheckremoteDebuggerPresent와 동일
NtQueryinformationProcess(hProcess, 7 , &hport, sizeof hPrt, & result); 디버그 포트 검사
NtQueryinformationProcess(GetCurrentProcess(0, 0x1e, &hDebugObject, 4, NULL); 디버그 오브젝트 검사
NtQueryObject
NtQueryinformationProcess(xx, 3)NtQueryinformationProcess(xx, 0x1f // ProcessDebugFlag, 4 , NULL );
NtSetinformationThread : 쓰레드를 디버거로부터 감추기
NtSetinformationThread(GetCurrentThread(), 0x11, 0, 0);

자작 플러그인 소개합니다.

Spy++이나 ProcessExplorer의 윈도우 찾기 기능과 동일하게 드래그하여 윈도우를 선택하여 어태치 할 수 있게 도와주는 플러그인입니다.

 

File -> Attatch -> 프로세스 선택 하는 복잡한 과정없이 간단하게 드래그 한방이면 끗

 

 

Plugin 폴더에 넣고 실행시 다음과 같이 아이콘이 나타납니다.

 

클릭하면 OllyDbg 윈도우가 최소화 되고 다른 윈도우를 선택하면 하일라이트 됩니다. 클릭한 버튼을 때면 그 윈도우에 어태치 됩니다.

 

Explorer.exe에 어태치 하면 난감한 상황이 발생하니 그 경우는 어태치 되지 않도록 예외처리 해놨습니다.

DrAttacher.dll

 

상당히 불친절한 풀이 시작하겠다.

http://reversing.kr/

[Challenge]

1.Easy Crack

 

다운 받고 실행하면 다음과 같은 그림이 나온다.

 

혹시나 싶어서 마음의 소리를 입력해보면 틀렸다고 나온다. 제대로된 패스워드를 입력하면 Good Boy! 같은 소리를 해주는 전형적인 크랙미 문제이다. 

 

 

가장 먼저 확인해야 될 부분은 Exeinfo 같은 프로그램으로 패킹상태와 어떤 언어로 작성되었는지를 보는것이다.

첫번째 문제라 다행히 가장 스탠다드한 언어인 c++로 작성되었고 패킹되어 있지 않았다. 안도의 한숨을 쉬자. (Themida나 VMProtect 같은 글자가 보이면 조용히 다음 문제를 보도록...)

 

IDA PRO 를 이용해서 전체 코드 구조를 파악해본다.

GetDlgItemTextA 함수 호출후  ( v3 != 97 || strncmp(&Str1, "5y", 2u) || strcmp(&v5, "R3versing") || String != 69 ) 이 관문들만 통과하면

MessageBoxA(hWnd, "Congratulation !!", "EasyCrackMe", 0x40u);

이런 축하합니다 소리를 들을수 있다.시작해보자

 

문자열을 검색해보니 반가운 글자들이 보인다. 자비없는 브레이크 포인트를 선사해 주기위해 거침없이 들어가자

 

1.GetDlgItemTextA 함수를 통해 사용자가 입력한 글자를 얻어온뒤

2.두번째 글짜[ESP+5]가 0x61('a') 인지 검사한다.

3.세번째 네번째 글자[ESP+A](중간에 Push 명령어가 있어 ESP가 변경됨)가 5y 인지 검사

4.나머지 뒤에 글자가 R3versing 인지 검사

 

5.첫번째 글자가 0x45('E') 인지 검사

 

답은 나왔다. 지금까지의 검사 조건들을 종합해보면

2.두번째 글자가 'a'                                                    Xa

3.세번째 네번째 글자가 "5y"                                        Xa5y

4.네번째 "R3versing"                                                 XaR3versing

5.첫번째 글자가 'E'                                                    EaR3versing

답 : EaR3versing

 

                  

 

 

 

 

+ Recent posts