no image
Basic RCE L11
문제는 OEP와 Stolenbyte를 찾는 문제입니다 :D PEiD로 프로그램을 확인해보니 UPX로 패킹이 되어 있네요 ! Stolenbyte를 찾아야하니 언패킹하지 않고 바로 찾겠습니다 :D 이제 POPAD 찾아가는건 능숙하죠 ㅎㅎㅎ?! 앞의 문제에서 계속해왔던거라 설명 생략하고 진행하겠습니다! POPAD 다음 PUSH 명령어가 보입니다! Stolenbyte임을 알 수 있죠 ㅎㅎㅎ? 계속 내려가서 OEP로 가봅시다! 40100C부터 있네요! 그럼 OEP가 40100C라고 생각할 수도 있지만.. OEP는 401000이겠죠 ㅎㅎㅎ? 그리고 총 12byte의 NOP이 존재합니다! 그럼 12byte의 stolenbyte가 있어야하니까 [POPAD] 그림에서 PUSH 명령어 3개가 Stolenbyte가 되겠네요..
2020.02.24
no image
Basic RCE L10
이번에는 OEP와 등록성공으로 가는 OPCODE를 구하라고합니다! PUSHAD를 보아하니 패킹이 되어있군요 :D 한번 확인해봅시다! 이번에는 ASPacking이 되어있습니다! UPX가 아니군요..! 일단 전 문제 풀이에서 공부했던 방식으로 OEP를 찾아가도록 하겠습니다 :D OEP를 찾아왔습니다! 그런데 아무런게 보이지 않는군요? [Ctrl] + [A] 를 누르면 본래 코드들을 볼 수 있습니다 :D 그럼 쉬운방법으로 찾기 위해 문자열로 찾아봅시다 :D 문자열을 검색하니 Registered가 보입니다! 더블클릭으로 들어가 봅시다 :D 조금더 위에 보니 JNZ 분기가 보이네요 ! 저 분기에 따라 Registerd 문자열이 출력이 되는것을 보아 "등록성공" 으로가는 분기임을 알 수 있습니다! 이만 Basic ..
2020.02.23
no image
Basic RCE L09
StorlenByte를 구하라고 하네요 :D 일단 열어봅시다! 또 PUSHAD가 나왔습니다! 패킹이 되어있다는 소리겠죠 ㅎㅎㅎ? 이번에는 한번에 POPAD로 가는 방법을 알려드리겠습니다! PUSHAD를 실행시키면 8개의 레지스터가 스택에 쌓인다고 했죠 :D 쌓인 순간의 스택의 위치를 메모리 주소로 찾아갑니다! 그럼 ESP의 위치는 19FF54이므로 메모리도 19FF54로 Go To([Ctrl]+[G]) 해주도록 합시다 :D 그다음 첫번째 바이트에 브레이크 보인트를 걸어줍니다! 그리고 [F9]를 눌러 실행을 시켜주면 바로 POPAD 밑으로 갑니다! 이렇게 말이죠 :D 그런데 PUSH 명령어가 3개가 존재하는 걸 볼 수 있습니다! StolenByte의 의미를 알아야 하는데요 ! 패커가 임의로 이동 시킨 코드..
2020.02.15
no image
Basic RCE L08
OEP를 구하라고 하네요 :D 일단 Ollydbg로 올려봅시다! 올려보니 PUSHAD가 존재합니다! 패킹이 되어 있다는 소리인데.. 이번에는 패킹을 디버깅으로 풀어보도록 하겠습니다 :D 먼저 PUSHAD는 무엇이냐! 8개의 레지스터를 스택에 쌓아줍니다! (EAX -> ECX -> EDX -> EBX -> ESP -> EBP -> ESI -> EDI) 그리고 PUSHAD가 존재하면 마지막엔 반드시 POPAD가 존재한다는거 있지마세요 :D 자 위의 레지스터를 잘 주목해보세요! 지금 보이시나요? 레지스터가 들고 있던 값들이 전부 스택에 쌓아졌습니다! 1020C41 주소에서 ESI에 들어가는 주소인 101A000을 보면 Packing된 내용들이 들어가 있습니다! 1020C4C에 보면 EDI값을 스택에 쌓는데 보..
2020.02.14
no image
Basic RCE L07
문제를 보니 "CodeEngn은 어떤것으로 변경되는가?" 입니다. 조건이 컴퓨터 C 드라이브의 이름이 CodeEngn일 경우라네요! 그럼 일단 C드라이브의 이름을 바꿔줍시다! (저는 처음에 C드라이브 이름 안바꾸고 했다가 한참 애먹었습니다..ㅠㅠ) 자 변경을 시키고 Ollydbg로 열어줍니다 :D EP입니다! 처음부터 GetModuleHandleA함수를 통해 어떤 모듈의 정보를 가져오는군요 :D https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlea GetModuleHandleA function (libloaderapi.h) - Win32 apps Retrieves a module han..
2020.02.13
no image
Basic RCE L06
문제를 보니 Unpack을 한 후 Serial을 찾으라고 되어 있군요 :D Unpack을 하란말은 Packing이 되어 있다는 말이겠죠 ㅎㅎㅎㅎ 다운받으시고 OllyDbg로 열어보면 PUSHAD로 시작하는 것을 보아 Packing이 되어 있는것을 확인할 수 있습니다. (Unpack 하는 과정은 "Basic RCE L05" 포스팅에 나와있습니다 :D) OEP가 보입니다. OEP는 Original Entry Point의 약자로 Packing이 되어 있을 때 기존의 EP를 의미합니다. 즉 Unpack하여 나온 프로그램의 EP가 OEP가 되겠군요 :D 다음 시리얼을 찾아야하는데 쉽게 찾는 방법 말씀드렸죠 ㅎㅎㅎ? [Search for] - [All referenced text strings]을 이용하여 문자열을..
2020.02.12
no image
Basic RCE L05
프로그램의 등록키는 무엇인가 입니다! Ollydbg로 올려보겠습니다 :D 처음부터 PUSHAD 명령어가 보입니다. 생소한 시작이네요.. PUSHAD 명령어로 시작한다는 것은 현재 프로그램이 Packing 되어 있다는 것을 의미합니다 :D PEiD라는 툴이 있는데 이는 프로그램의 상태를 보여줍니다! "UPX 0.89.6 ~~ "로 시작되어 있는거 보이시나요 :D 그리고 EP Section이 현재 UPX1으로 나타납니다! 이는 UPX Packer로 Packing 되어 있다는 얘기죠! 블로깅 전에는 Google을 이용하여 스스로 공부하시길 바랍니다 :D 아주 잘 나와있어용 ! https://github.com/upx/upx/releases/tag/v3.94 upx/upx UPX - the Ultimate Pa..
2020.02.10
no image
Basic RCE L04
먼저 문제를 봅시다! 디버거를 탐지하는 함수의 이름을 찾으라네요 :D EP(Entry Point) 입니다! 그리고 도스 프로그램이 켜지네요 :D [F8]을 누르면서 계속해서 내려가 봅시다! 계속해서 내려가다보니 빨간칸으로 표시 되어있는 곳에서 갑자기 "디버깅 당함"이라는 문자열이 출력되기 시작합니다. 그리고 더이상 분석이 안되더군요! 그래서 저 지점을 기억한 후 [Ctrl]+[F2]를 누르고 다시 시작해서 저 함수로 들어가 봅시다 :D 함수를 분석해보니 Sleep 함수와 IsDebuggerPresent 함수가 보입니다. 계속가다 401074 주소의 함수에서 "디버깅 당함"이라는 문자열이 출력됩니다. 그래서 저기 함수를 분석해보니 특별히 디버깅을 탐지하는 듯한 로직은 보이지 않습니다 : ( 계속해서 디버깅..
2020.02.09

Basic RCE L11

HelloMG
|2020. 2. 24. 17:43

Basic RCE L11 문제

문제는 OEP와 Stolenbyte를 찾는 문제입니다 :D

PEiD

PEiD로 프로그램을 확인해보니 UPX로 패킹이 되어 있네요 !

Stolenbyte를 찾아야하니 언패킹하지 않고 바로 찾겠습니다 :D

POPAD

이제 POPAD 찾아가는건 능숙하죠 ㅎㅎㅎ?!

앞의 문제에서 계속해왔던거라 설명 생략하고 진행하겠습니다!

 

POPAD 다음 PUSH 명령어가 보입니다!

Stolenbyte임을 알 수 있죠 ㅎㅎㅎ?

 

계속 내려가서 OEP로 가봅시다!

OEP

40100C부터 있네요!

그럼 OEP가 40100C라고 생각할 수도 있지만.. OEP는 401000이겠죠 ㅎㅎㅎ?

 

그리고 총 12byte의 NOP이 존재합니다!

그럼 12byte의 stolenbyte가 있어야하니까

[POPAD] 그림에서 PUSH 명령어 3개가 Stolenbyte가 되겠네요 :D

 

이렇게 쉽게 풀 수 있었습니다 :D

앞에서 계속 풀어왔던 문제를 복습하는 듯한 느낌이네요 !

 

이만 문제풀이 마치겠습니다 :D

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L13  (0) 2020.03.22
Basic RCE L12  (0) 2020.02.28
Basic RCE L10  (0) 2020.02.23
Basic RCE L09  (0) 2020.02.15
Basic RCE L08  (0) 2020.02.14

Basic RCE L10

HelloMG
|2020. 2. 23. 15:43

Basic RCE L10 문제

이번에는 OEP와 등록성공으로 가는 OPCODE를 구하라고합니다!

PUSHAD

PUSHAD를 보아하니 패킹이 되어있군요 :D

한번 확인해봅시다!

ASPack

이번에는 ASPacking이 되어있습니다!

UPX가 아니군요..!

 

일단 전 문제 풀이에서 공부했던 방식으로 OEP를 찾아가도록 하겠습니다 :D

OEP

OEP를 찾아왔습니다!

그런데 아무런게 보이지 않는군요?

[Ctrl] + [A] 를 누르면 본래 코드들을 볼 수 있습니다 :D

[Ctrl] + [A]

그럼 쉬운방법으로 찾기 위해 문자열로 찾아봅시다 :D

문자열 검색

문자열을 검색하니 Registered가 보입니다!

 

더블클릭으로 들어가 봅시다 :D

JNZ 분기

조금더 위에 보니 JNZ 분기가 보이네요 !

 

저 분기에 따라 Registerd 문자열이 출력이 되는것을 보아 "등록성공" 으로가는 분기임을 알 수 있습니다!

 

이만 Basic RCE L10 문제풀이를 마치겠습니다 :D

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L12  (0) 2020.02.28
Basic RCE L11  (0) 2020.02.24
Basic RCE L09  (0) 2020.02.15
Basic RCE L08  (0) 2020.02.14
Basic RCE L07  (0) 2020.02.13

Basic RCE L09

HelloMG
|2020. 2. 15. 17:22

Basic RCE L09 문제

StorlenByte를 구하라고 하네요 :D

 

일단 열어봅시다!

PUSHAD

또 PUSHAD가 나왔습니다!

패킹이 되어있다는 소리겠죠 ㅎㅎㅎ?

 

이번에는 한번에 POPAD로 가는 방법을 알려드리겠습니다!

Go to

PUSHAD를 실행시키면 8개의 레지스터가 스택에 쌓인다고 했죠 :D

쌓인 순간의 스택의 위치를 메모리 주소로 찾아갑니다!

그럼 ESP의 위치는 19FF54이므로 메모리도 19FF54로 Go To([Ctrl]+[G]) 해주도록 합시다 :D

Hardware BP

그다음 첫번째 바이트에 브레이크 보인트를 걸어줍니다!

 

그리고 [F9]를 눌러 실행을 시켜주면 바로 POPAD 밑으로 갑니다!

POPAD

이렇게 말이죠 :D

그런데 PUSH 명령어가 3개가 존재하는 걸 볼 수 있습니다!

 

StolenByte의 의미를 알아야 하는데요 !

패커가 임의로 이동 시킨 코드의 윗부분을 의미를 합니다 :D

이러한 경우 정상실행이 되지 않기 때문에 제 위치에 놓은 뒤 덤프를 시켜 정상 실행을 시켜줘야 하죠!

 

덤프하는 방법은 다른 사이트에도 많이 나와있으니 한번 꼭 해보시길 바랍니다 !

* 많은 공부가 되실꺼예요 ㅎㅎㅎ *

 

그럼 저 3개의 PUSH 명령어가 StolenByte면 OEP로 돌아갔을 때 정상적인 모습이 나오지 않겠죠 :D ?

OEP

OEP로 돌아가보니 정상적이지 않은 것을 보아 StolenByte임을 알 수 있습니다!

 

그러므로 정답은 "6A0068002040006812204000"이 되겠네요 ㅎㅎㅎㅎ

 

이만 9번 문제 풀이를 마치겠습니다 :D

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L11  (0) 2020.02.24
Basic RCE L10  (0) 2020.02.23
Basic RCE L08  (0) 2020.02.14
Basic RCE L07  (0) 2020.02.13
Basic RCE L06  (0) 2020.02.12

Basic RCE L08

HelloMG
|2020. 2. 14. 16:56

Basic RCE L08 문제

OEP를 구하라고 하네요 :D

 

일단 Ollydbg로 올려봅시다!

PUSHAD

올려보니 PUSHAD가 존재합니다! 패킹이 되어 있다는 소리인데..

이번에는 패킹을 디버깅으로 풀어보도록 하겠습니다 :D

 

먼저 PUSHAD는 무엇이냐!

8개의 레지스터를 스택에 쌓아줍니다!

(EAX -> ECX -> EDX -> EBX -> ESP -> EBP -> ESI -> EDI)

 

그리고 PUSHAD가 존재하면 마지막엔 반드시 POPAD가 존재한다는거 있지마세요 :D

레지스터

자 위의 레지스터를 잘 주목해보세요!

스택

지금 보이시나요?

레지스터가 들고 있던 값들이 전부 스택에 쌓아졌습니다!

ESI

1020C41 주소에서 ESI에 들어가는 주소인 101A000을 보면

Packing된 내용들이 들어가 있습니다!

EDI

1020C4C에 보면

EDI값을 스택에 쌓는데 보면 아무런 값이 없습니다 !

앞으로 이공간에 복호화된 값이 들어가게 될것입니다 ㅎㅎㅎ

 

자 그럼 트레이싱 기능을 이용해서 계속 분석해보도록 하다보면..

복호화된 값

이렇게 복호화된 값들이 들어가게 됩니다!

LoadLibraryA

그러다 LodaLibraryA를 통해서 Kernel32.dll을 로드합니다.

이것이 의미하는 바는 그 안에 존재하는 함수를 사용하겠다는 의미입니다.

그럼 한번 IAT를 살펴보도록 합시다!

IAT

IAT에 보니 API가 현저히 보족한거 보이실겁니다 !

즉, LodaLibraryA로 Kernel32.dll을 로드하는 이유는 GetProcAddress를 이용해서 복구하기 위해서였네요 :D

복구 루틴

이렇게 복구하는 루틴입니다!

EDI가 가지는 값을 한번 살펴볼까요 :D

EDI

보니 API의 이름을 확인할 수 있네요!

API 이름 목록을 인자로 받아 GetProcAddress를 호출하고 해당 인자를 EAX에 저장합니다.

101F008부터 EAX의 값을 저장하면서 Kernel32.dll의 IAT를 복구하고 다른 IAT도 모두 복구시킵니다!

복구된 IAT

이렇게 복구가 되면 VirtualProtect 함수를 만나게 되고 실행권한을 부여합니다!

VirtualProtect

그리고 처음에 말했듯이 PUSHAD가 존재하면 POPAD도 존재한다고 했었죠 ㅎㅎㅎ?

이렇게 POPAD를 만나면 Unpacking이 마무리된 단계입니다 :D

그리고 ESP 값을 원래대로 되돌려 줍니다!

ESP-80

그리고 JMP를 통해서 OEP로 가게됩니다!

OEP

그래서 정답은 1012475입니다 :D

 

사실상 UPX로 언패킹하면 쉽게할 수 있지만 한번쯤은 이렇게 알아보는것도 공부가 될거라 생각합니다!

여기서 꿀팁!

POPAD를 바로찾아가는 방법도 있습니다만..

또 다른문제에서 패킹문제가 존재한다면 그 방법을 통해서 분석하도록 하겠습니다!

 

그럼 8번 문제 풀이를 마치겠습니다 :D

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L10  (0) 2020.02.23
Basic RCE L09  (0) 2020.02.15
Basic RCE L07  (0) 2020.02.13
Basic RCE L06  (0) 2020.02.12
Basic RCE L05  (0) 2020.02.10

Basic RCE L07

HelloMG
|2020. 2. 13. 19:03

Basic RCE L07 문제

문제를 보니 "CodeEngn은 어떤것으로 변경되는가?" 입니다.

조건이 컴퓨터 C 드라이브의 이름이 CodeEngn일 경우라네요!

 

그럼 일단 C드라이브의 이름을 바꿔줍시다!

(저는 처음에 C드라이브 이름 안바꾸고 했다가 한참 애먹었습니다..ㅠㅠ)

C 드라이브 이름 변경

자 변경을 시키고 Ollydbg로 열어줍니다 :D

EP

EP입니다!

처음부터 GetModuleHandleA함수를 통해 어떤 모듈의 정보를 가져오는군요 :D

https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlea

 

GetModuleHandleA function (libloaderapi.h) - Win32 apps

Retrieves a module handle for the specified module. The module must have been loaded by the calling process.

docs.microsoft.com

그리고 DialogBoxParamA을 지나칠 때

다이얼로그박스가 실행이되는 것을 알 수 있습니다!

 

그리고 어떤값을 입력하라고 하는군요 :D

그래서 저는 좀 살펴보다가 밑에서 비교구문이랑 성공 및 실패 메시지박스 발견할 수 있었습니다!

비교구문

그럼 BP(BreakPoint)를 걸어주고 다이얼로그에

test라는 값을 입력해 주었습니다!

lstrcatA

그러자 입력한 test가 보이는군요!

그런데 lstrcatA가 보입니다 :D

lstrcat함수는 간략하게 설명해서 문자열을 이어붙여주는 기능을 합니다.

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-lstrcata

 

lstrcatA function (winbase.h) - Win32 apps

Appends one string to another.Warning  Do not use.

docs.microsoft.com

lstrcatA는 취약점을 가진 함수네요!

어떤 취약점인지 이를 가지고 무엇을 할 수 있는지는 스스로 공부해보시길 바랍니다 :D

lstrcatA 2

ConcatString의 변수에 StringToAdd변수의 문자열이 붙여진걸 볼 수 있습니다!

그리고 계속실행하면 lstrcmpiA 함수가 보이네요 :D

lstrcmpiA

그러자 최종적으로 비교하는 것은

"test", "L2C-5781EqfqEngn4562-ABEX"

입니다!

 

그럼 정답이 무엇인지 짐작이 오시죠 :D?

성공

이렇게 성공했다는 메세지 박스를 받았습니다!

 

어떤 문자열의 암호화된 부분을 찾아내는 문제였네요 :D

이만 7번 문제 풀이를 마치겠습니다 !

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L09  (0) 2020.02.15
Basic RCE L08  (0) 2020.02.14
Basic RCE L06  (0) 2020.02.12
Basic RCE L05  (0) 2020.02.10
Basic RCE L04  (0) 2020.02.09

Basic RCE L06

HelloMG
|2020. 2. 12. 20:56

Basic RCE L06 문제

문제를 보니 Unpack을 한 후 Serial을 찾으라고 되어 있군요 :D

Unpack을 하란말은 Packing이 되어 있다는 말이겠죠 ㅎㅎㅎㅎ

 

다운받으시고 OllyDbg로 열어보면 PUSHAD로 시작하는 것을 보아 Packing이 되어 있는것을 확인할 수 있습니다.

(Unpack 하는 과정은 "Basic RCE L05" 포스팅에 나와있습니다 :D)

OEP

OEP가 보입니다.

OEP는 Original Entry Point의 약자로 Packing이 되어 있을 때 기존의 EP를 의미합니다.

즉 Unpack하여 나온 프로그램의 EP가 OEP가 되겠군요 :D

 

다음 시리얼을 찾아야하는데 쉽게 찾는 방법 말씀드렸죠 ㅎㅎㅎ?

[Search for] - [All referenced text strings]을 이용하여 문자열을 찾아보면 밑의 부분에서

시리얼 같아 보이는것을 찾을 수 있었습니다!

Serial

시리얼을 비교하는 부분에 브레이크포인트를 걸어준 후 [F9]를 눌러서 실행시키고

시리얼을 입력할 때 입력을 하여 줍니다!

You got it :)

그리고 계속해서 [F9]를 눌러 실행시키면

"You got it :)"

이라는 메시지박스가 실행이 되는군요 ㅎㅎㅎ!

 

그럼 6번 문제 풀이 포스팅을 마치도록 하겠습니다 :D

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L08  (0) 2020.02.14
Basic RCE L07  (0) 2020.02.13
Basic RCE L05  (0) 2020.02.10
Basic RCE L04  (0) 2020.02.09
Basic RCE L03  (0) 2020.02.07

Basic RCE L05

HelloMG
|2020. 2. 10. 17:39

Basic RCE L05 문제

프로그램의 등록키는 무엇인가 입니다!

Ollydbg로 올려보겠습니다 :D

PUSHAD

처음부터 PUSHAD 명령어가 보입니다.

생소한 시작이네요..

 

PUSHAD 명령어로 시작한다는 것은 현재 프로그램이 Packing 되어 있다는 것을 의미합니다 :D

PEiD라는 툴이 있는데 이는 프로그램의 상태를 보여줍니다!

PEiD_v0.95.zip
0.42MB
PEiD

"UPX 0.89.6 ~~ "로 시작되어 있는거 보이시나요 :D

그리고 EP Section이 현재 UPX1으로 나타납니다!

이는 UPX Packer로 Packing 되어 있다는 얘기죠!

 


블로깅 전에는 Google을 이용하여 스스로 공부하시길 바랍니다 :D

아주 잘 나와있어용 !


 

https://github.com/upx/upx/releases/tag/v3.94

 

upx/upx

UPX - the Ultimate Packer for eXecutables. Contribute to upx/upx development by creating an account on GitHub.

github.com

명령프롬프트로 upx 프로그램이 존재하는 경로까지 이동해줍시다.

그리고 "upx.exe"를 입력하면 옵션을 볼 수 있습니다 :D

upx.exe

저희는 unpacking 해줘야 하기 때문에

"upx.exe -d 프로그램이름"

이용해줍니다!

 

+ 언팩킹하실 때 권한이 없다고 뜨신다면, 05.exe 프로그램이 동작 중인지 확인하시기 바랍니다 :D

unpacking

unpacking이 되었다면 PEiD로 확인해봅시다 :D

Unpacking 후 PEiD

쨘! Borland Delphi 4.0 -5.0 로 바뀌었죠 :D ?

그리고 EP Section 또한 Code로 변경되었습니다!

이제 순조롭게 분석을 시작해보도록 합시다 :D

EP

EP입니다. 빠르고 쉽게 분석하기 위해 앞서 알게된

[Search for] - [All referenced text strings] 옵션을 이용해봅시다 :D

[Search for] - [All referenced text strings]

내려가 보니 시리얼로 보이는 부분과 성공, 실패 시 출력되는 문구같은 곳을 발견할 수 있었습니다 :D

Point

그래서 실행시켜보니 프로그램이 실행이되고 유저 이름과 시리얼 번호를 적는 칸이 존재하더군요 !

아무값이나 시도해보았는데 자꾸 실패가 됩니다 : (

 

그래서 분석결과 표시된 CALL 함수에서 확인 후 JNZ에서 넘어가게 됩니다 !

그럼 CALL 함수로 들어가봅시다!

CALL 분석

CALL 내부로 들어가니 어떤 두개의 값을 비교합니다 !

제가 입력한 값과 "Unregistered..." 비교값인 "Registered User"을 비교하는군요 :D

Registered User

그리고 마저실행하니 예상대로 실패 메시지 박스가 실행됩니다.

실패

그래서 "Unregistered..." -> "Registered User"로 변경을 하였습니다.

그런데 또 무언가를 비교하는군요 ?

앞에 이름을 비교하는것처럼 똑같은 방식으로 시리얼을 비교하고 있습니다 :D

Serial Number

그럼 ASCII로 나타나있는 저 시리얼 번호가 진짜 번호겠죠 :D ?

입력해봅시다!

성공

이렇게 간단히 찾을 수 있었습니다 :D

 

이번 문제에서는 Packing부분을 알아야 풀 수 있는 문제가 아니었나 생각이 듭니다 :D

 

여기서 중요한 것은 Packing이 되어 있다고 해서 분석을 못하는 것은 아닙니다!

Packing되어있는 부분을 진행시키다 보면 OEP를 마주하게 되고

그때부터는 Unpacking되어 있는 것처럼 분석이 가능하니까요 :D

그러나 편의상 upx 프로그램을 이용하여 언패킹해서 문제를 풀어보았습니다!

 

반드시 Packing 되어 있는 상태에서 직접 분석 해보시기를 바랍니다 :D

또 하나의 공부로써 도움이 많이 되걸랑요 >_<

 

그럼 5번문제 풀이를 마치겠습니다!

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L07  (0) 2020.02.13
Basic RCE L06  (0) 2020.02.12
Basic RCE L04  (0) 2020.02.09
Basic RCE L03  (0) 2020.02.07
Basic RCE L02  (0) 2020.02.03

Basic RCE L04

HelloMG
|2020. 2. 9. 17:25

Basic RCE L04 문제

먼저 문제를 봅시다!

디버거를 탐지하는 함수의 이름을 찾으라네요 :D

EP(Entry Point)

EP(Entry Point) 입니다!

그리고 도스 프로그램이 켜지네요 :D

[F8]을 누르면서 계속해서 내려가 봅시다!

디버깅 탐지

계속해서 내려가다보니 빨간칸으로 표시 되어있는 곳에서

갑자기 "디버깅 당함"이라는 문자열이 출력되기 시작합니다.

그리고 더이상 분석이 안되더군요!

 

그래서 저 지점을 기억한 후 [Ctrl]+[F2]를 누르고 다시 시작해서 저 함수로 들어가 봅시다 :D

함수 분석

함수를 분석해보니 Sleep 함수와 IsDebuggerPresent 함수가 보입니다.

계속가다 401074 주소의 함수에서 "디버깅 당함"이라는 문자열이 출력됩니다.

그래서 저기 함수를 분석해보니 특별히 디버깅을 탐지하는 듯한 로직은 보이지 않습니다 : (

 

계속해서 디버깅을 해보았습니다!

무한루프

여기서 무한루프가 걸립니다!

그이유는 뭘까요?

40108B 주소에서 JMP명령어로 처음으로 계속 돌아가게 됩니다.

 

즉, 저 구간이 계속해서 빙빙 돌아간다는 거죠!

그럼 디버깅을 탐지하는 함수는 무엇이냐인데..

IsDebuggerPresent 함수가 정답입니다!

 

IsDebuggerPresent 함수는 PEB 구조체의 디버깅 상태값을 확인하여

디버깅 시 1을 리턴하고 아니면 0을 리턴합니다 :D

https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent

 

IsDebuggerPresent function (debugapi.h) - Win32 apps

Determines whether the calling process is being debugged by a user-mode debugger.

docs.microsoft.com

자세한 사항은 위의 microsoft 정식 홈페이지에서 확인하시면 됩니다 :D

1을 리턴

현재 Ollydbg로 디버깅 중이기 때문에

1을 리턴한다고 했죠 ?

 

위의 사진을 보다시피 EAX가 1로 반환된 것을 볼 수 있습니다 :D

 

 

그럼 이를 우회하는 방법은 없을까요!?

 

다양한 방법이 있습니다!

 

 

첫번째

IsdebuggerPresent 함수로 반환된 EAX 값을 0으로 강제로 변경해주면 되겠죠 :D ?

Modify EAX

바꿔주는 이유는 당연히 EAX를 0으로 바꾸면 디버깅하고 있지 않다는 뜻이니까요!

 

 

두번째

IsDebuggerPresent함수를 "MOV EAX, 0"로 변경하면 됩니다!

MOV EAX, 0

그럼 EAX값이 변하지 않겠죠 ㅎㅎㅎ?

 

 

세번째

PEB 구조체의 디버깅 상태값을 변경해 버리는 겁니다 :D

처음부터 차근차근해봅시다!

 

먼저 IsDebuggerPresent 함수로 들어가면 MOVZX 명령어가 나옵니다.

MOVZX 명령어를 실행 전까지 실행시키고

EAX 값에서 오른쪽 클릭하여 [Follow in Dump] 기능을 이용합니다 :D

Follow in Dump

그럼 메모리 부분 구조체로 이동하게 되고

빨간 칸으로 표시된 부분이 바로 디버깅 상태값입니다 :D

디버깅 상태 값 변경 전

저 부분을 클릭 후 [Space] 바를 눌러서 0으로 변경을 시켜줍시다!

디버깅 상태 값 변경 후

이후 실행하면 정상이라고 출력되는 것을 볼 수 있습니다 :D

IsDebuggerPresent 우회

 

이렇게 IsDebuggerPresent 함수에 대해 알아보았고 우회하는 방법까지 알아보았습니다 :D

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L06  (0) 2020.02.12
Basic RCE L05  (0) 2020.02.10
Basic RCE L03  (0) 2020.02.07
Basic RCE L02  (0) 2020.02.03
Basic RCE L01  (0) 2020.01.31