본문 바로가기
Security/Reversing

[CodeEngn] Challenges Basic RCE L04, L05, L06

by jino22 2021. 8. 6.

틀린 부분이 있다면 언제든지 댓글 남겨주세요! 

 


CodeEngn_Challenges Basic RCE L04

L04. 이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다. 디버거를 탐지하는 함수의 이름은 무엇인가

 

파일을 실행시키면 다음과 같이 그냥 실행시켰을 땐 '정상', 디버거를 통해 실행시켰을 경우 '디버깅 당함'이 나온다.

현재 프로그램이 디버깅을 당하고 있는지 체크하는 프로그램이다.

좌-그냥 실행시켰을 때 / 우-디버깅을 통해 실행시켰을 때

ollydbg에서 파일을 열어 진행해보았다. 

계속 진행하다보면 40100F 함수에서 cmd창에 탐지 여부 결과가 출력되며 코드 진행이 끝난다. 이 함수 안에서 루프문을 돌고 있는 것으로 보인다.

함수로 들어가보면 아래의 코드를 반복하면서 정상/디버깅 당함 여부를 체크하는 것으로 추측된다.

 

KERNEL32.IsDebuggerPresent에서 디버깅 여부를 확인하고 정상이라면 40106D에서 40107E로 분기하고, 디버깅 중이라면 다음 줄로 진행되어 '디버깅 당함'을 출력하는 함수로 이동한다. 

루프

* Kernel32.IsDebuggerPresent호출 프로세스가 사용자 모드 디버거에 의해 디버깅되고 있는지 여부를 결정.

(현재 프로세스가 디버거에서 실행중인 경우 반환값은 0이 아님)

 

현재 ollydbg에서 실행중이므로 IsDebuggerPresent의 반환값이 1이고, 이는 디버거에서 실행중이라는 의미이므로 '디버깅 당함' 문자열이 출력된다.

여기서 반환값을 0으로 바꾼다면 다음과 같이 '정상'이 출력된다. 

IsDebuggerPresent 반환값에 따른 결과

디버거를 탐지하지 않고 정상만 출력되게 하기 위해서는 API 내에서 수정 후 패치해야 하지만 문제를 풀기 위해 접근한 것이므로 간단히 확인만 하고 마무리한다.

따라서 디버거를 탐지하는 함수는 IsDebuggerPresent이다. 

 

 


 

_Challenges Basic RCE L05

 

L05. 이 프로그램의 등록키는 무엇인가

 

이 프로그램을 실행시키면 다음과 같이 좌측의 메시지박스가 나오고, Register now! 버튼을 누르면 우측 메시지박스가 나온다.

현재 쓰여져 있는 시리얼 번호가 아닌 올바른 시리얼 번호를 찾는 것이 이 문제의 목표이다.

프로그램 실행시 메시지박스

파일 구조를 확인해보니 UPX로 실행압축된 파일이다. 

언패킹하는 프로그램을 사용해도 되지만 ollydbg로 트레이싱하여 직접 언패킹 해보도록 하겠다.

Exeinfo 프로그램으로 파일 정보 확인

ollydbg로 파일을 열어보니 PUSHAD가 가장 먼저 보인다.

PUSHAD이후 ESI와 EDI에 값을 넣는데 이때 ESI가 압축해제된 원본 파일의 코드가 저장될 장소이다.

EP

압축해제 과정은 많은 루프문으로 이루어져 있다.

이 루프문을 모두 보면서 찾아가면 좋지만 빠르게 OEP를 찾는 방법도 있다.

UPX는 PUSHAD/POPAD로 이루어져 있다는 특징을 이용하는 것이다. 

 

코드 맨 처음에 PUSHAD가 있으므로 POPAD도 있을 것이다. POPAD 근처에서 OEP를 찾을 수 있는 확률이 높다.

POPAD명령어 다음에 JMP명령어를 볼 수 있는데 이 코드가 OEP로 가는 부분이라고 추측할 수 있다. 

POPAD

+) 스택에 BP를 설정해서 OEP를 찾는 방법도 있음

더보기
PUSHAD이후 ESP값이 가리키는 주소로 dump > 하드웨어 BP 걸기

하드웨어 BP를 걸고 실행하면 BP설치된 명령어가 실행된 이후에 멈춘다.

따라서 저 부분에 BP를 걸고 실행하면 압축 해제 코드가 다 돌고 POPAD가 호출될 때 BP건 부분에 엑세스되어 break가 걸리게 된다.

그 다음 코드가 바로 OEP로 JMP하는 코드이기 때문에 OEP를 쉽게 찾을 수 있다.

OEP를 찾았으니 언패킹한 파일로 만들기 위해 dump를 뜬다. ollydbg의 ollydumpex plugin을 사용하면 편리하다.

이때 주의할 부분은 EntryPoint이다. OEP의 주소로 되어있는지 확인한다.

dump

dump과정에서 IAT가 손상되어 다음과 같이 파일이 제대로 실행되지 않을 수 있다.

LoadPE를 이용하여 IAT를 복구해준다.

 

* IAT(Import Address Table): 이 파일이 어떤 라이브러리에서 어떤 함수를 사용하고 있는지

좌-파일 손상 / 우-IAT복구

복구 후 다시 ollydbg에서 프로그램을 로드해보면 OEP인 441270값이 EP로 잘 동작하는 것을 볼 수 있다.

dump파일 실행

메시지박스에 있던 문자열을 단서로 하여 string부분에서 시리얼 번호로 추측되는 문자열을 찾을 수 있다.

search for > all referenced strings

찾은 문자열 위치로 가보면 시리얼 문자열을 비교하여 맞음/틀림 메시지 박스를 출력하는 코드를 찾을 수 있다.

사용자가 입력한 문자열을 EAX에, 정답 문자열을 EDX에 넣고 403B2C함수에서 비교한 후 JNE분기문을 통해 메시지를 출력하는 것으로 추측된다. 

우선 사용자명 먼저 체크하고 시리얼 번호를 체크한다. 

문자열 확인 코드

따라서 프로그램의 사용자명은 'Registered User' 등록키는 'GFX-754-IER-954'이다.

정답

 


 

_Challenges Basic RCE L06

 

L06. Unpack을 한 후 Serial을 찾으시오. (정답인증은 OEP + Serial Ex) 00400000PASSWORD)

 

파일을 실행시켜보니 시리얼번호를 찾는 프로그램이며 UPX로 패킹되어 있음을 알 수 있다.

파일 정보 확인

ollydbg로 열어 L05와 같은 방식으로 언패킹을 해본다.

하드웨어 BP를 거는 방식을 사용해 OEP가 401360이라는 것을 알아냈다.

POPAD 이후 JMP
OEP

dump를 뜨고 LoadPE를 통해 IAT복구도 했지만 파일이 손상되어 작동하지 않는다.

ollydbg에서 로드는 되지만 코드 진행이 원활하지 않다.   

 >> 이 부분은 좀 더 공부해서 추가하도록 하겠습니다!

우선 dump없이 원본 파일에서 답을 찾아보았다.

string을 확인하자마자 답을 찾아낸 것 같다.

string

해당 문자열 주소로 이동하여 코드 윗부분에 BP를 걸고 실행시켜 보았다.

문자열을 입력하는 메시지박스가 뜨고 '52dsfasfd'라는 임의의 문자열을 입력했다.

401290 함수에서 문자열을 비교하여 같으면 0, 다르면 1을 리턴하는 것으로 보인다.

현재는 문자열이 다르기 때문에 JNE 4010A3으로 분기하여 'ERROR' 메시지를 띄운다.

핵심 코드

만약 정답 문자열을 입력하면 EAX=0을 반환할 것이므로 JNE분기하지 않고 'Good Job!' 문자열을 출력할 것이다.

정답

 

따라서 OEP는 '401360', 정답 문자열은 'AD46DFS547' 이다.

728x90
반응형

'Security > Reversing' 카테고리의 다른 글

[CodeEngn] Challenges Basic RCE L10, L11, L12  (0) 2021.08.15
[CodeEngn] Challenges Basic RCE L07, L08, L09  (0) 2021.08.09
[CodeEngn] Challenges Basic RCE L01, L02, L03  (0) 2021.08.05
GDB 실습 1  (0) 2021.05.16
GDB 사용법  (0) 2021.05.05

댓글