캡스톤 디자인 #6 코드엔진 Basic RCE L01~L06

llip·2022년 5월 16일
0

캡스톤 디자인

목록 보기
6/9

지난 번에 어셈블리어에 관한 기초 공부를 진행했으므로 이번에는 직접 문제 풀이를 해보기로 했다.

https://ch.codeengn.com/

악성코드 분석을 위하여 코드 엔진의 Basic RCE 수준의 문제를 다 풀어보기로 했다. 푼 이후에는 Advance RCE 단계의 문제를 풀어보고 최종적으로는 Malware Analysis 수준의 문제를 풀어보기로 했다.

https://github.com/codeengn/codeengn-challenges-writeups
해당 링크의 해설을 참고하여 풀이를 진행했다.

Basic RCE L01

첫 번째로 풀어볼 문제.
GetDriveTypeA의 리턴값이 무엇이 되어야 하는지 알아야 한다.
풀이를 진행하기 위해 x64 dbg 툴을 사용한다.

f9를 통해 실행을 하다 보면 다음의 메시지 박스가 뜨게 된다.


첫 번째 실행 시 나타나는 메시지 박스.


두 번째 실행 시 나타나는 메시지 박스.

f9를 처음 눌렀을 때 보이는 실행창.
Entry Point로 이동하는 듯 싶다.


CDROM의 리턴 값을 보면 5로 설정되어 있다.
즉, 리턴값은 5가 되어야 이 문제가 풀리는 것이다.

다시 실행창으로 돌아가서 Comments까지 같이 보도록 하겠다.

Comments를 살펴보면 다음의 명령어가 보인다.

cmp eax, esi
je 01.40103D

eax와 esi를 비교했을 때 같지 않다면 40103D의 주소로 이동한다.

"Error"
"Nah... This is not a CD-ROM Drive!"

해당 주소의 이 문구를 보아하니 아까 전에 떴던 메시지 박스의 문구와 동일하다. 따라서 우리는 eax의 값과 esi의 값을 동일하게 만들어 줘야만 아래의 문구를 메시지 박스에서 볼 수 있다.

"YEAH!"
"Ok, I really think that your HD is a CD-ROM! :p"

f8 키를 누르며 GetDriveTypeA 함수까지 실행했을 때 다음과 같다.

첫 번째 메시지 박스가 닫힌 후 EAX의 리턴값.

두 번째 메시지 박스가 닫힌 후 EAX의 리턴값.


쭉 확인하면서 f8키를 누르다보니, cmp에서 eax와 esi의 값이 다름을 알 수 있었다. 우리는 이 값이 동일해야 올바르게 실행했을 때의 문구를 확인할 수 있다.

따라서 EAX를 더블 클릭한 후 다음과 같이 값을 수정한다.

다음과 같이 EAX의 값을 ESI와 똑같이 만들어주며 진행하면, 40103D로 이동하게 된다.

이후 디버깅은 중지된다.

의문점
원래라면 EAX도 ESI도 5를 입력해서 값이 동일할 경우 종료가 되어야 한다. ESI는 어째서 00000000으로 초기화가 안됐던 것일까?


Basic RCE L02

이번에 풀 문제.
패스워드를 분석해야 하는 것 같다.

다운받은 exe 파일을 실행해보면 정말 실행되지 않는다.

또한 x64 dbg로 분석하려 해도 잘못된 파일이라고 나온다.

찾아보니 HexEditor 같은 툴로 해당 파일을 열어봐야 하는 것 같다. 이건 Ghidra나 x64 dbg를 이용할 필요가 없어보여서 직접적인 관련은 없을 것 같기도 하다.

툴을 사용하여 열어보고 아래로 내리다 보면, 다음과 같은 코멘트를 확인할 수 있다.

파일을 여는 방법은 아마 디펜더를 꺼야한다고 생각한다. 아무튼, 글에 따라 해석해보면 비밀번호는 JK3FJZh 인듯 하다.


Basic RCE L03

스트링 비교함수의 이름을 찾는 문제인 것 같다.

exe 파일을 실행해보니 다음과 같은 창이 나타난다. 다른 풀이를 보면 패스워드의 입력창이 나오는 것 같은데.. x32 dbg에 넣어도 바로 실행이 종료된다.

그래서 MSVBVM50을 다운받았더니 메시지도 잘 뜨고 x32 dbg에서도 잘 열린다.

우선 실행 시 나타나는 메시지 문구는 독일어로 '이 Nag를 제거하거나 올바른 암호를 얻으십시오!' 라고 써있다.

비밀번호를 입력할 수 있다.

잘못된 암호를 입력할 경우 암호가 틀렸다고 나오는 것 같다.

x32 dbg로 해당 파일을 열어 살펴보다보면, 코멘트에서 다음과 같은 수상한 문구를 확인할 수 있다.

2G83G35Gs2를 창에 입력해보니 다음과 같은 문구가 뜬다.

갑사합니다, 올바른 암호입니다 라는 뜻인듯 하다.

다시 코드를 살펴보면 다음과 같다.

401DDC에 정답의 값이 들어가면 시스템은 vbaStrCmp 함수를 호출한다.
strcmp는 문자열 비교함수이므로 정답은 vbastrcmp인 것 같다.


Basic RCE L04

4번 문제는 디버거를 탐지하는 함수의 이름을 찾는 것이다.

파일을 다운받아 압축을 풀고 exe를 실행하면 다음과 같은 창이 나타난다.

일정한 간격을 두고 계속해서 정상이라는 단어를 출력한다.

x32 dbg를 통해 해당 파일을 열어보면 똑같이 창이 뜨지만 아무런 문구도 출력되지 않는다.
해설을 살펴보니 ollydbg를 이용하여 파일을 열면 디버깅 당함이라는 문구가 계속해서 출력되는듯 하다.

f9를 눌러 실행창을 키고 f8을 누르며 실행하다보니, 아래와 같은 주소에서 창이 뜨고 디버깅 당함이라는 문구가 계속해서 출력됐다.

f8을 눌러도 더이상 진행되지 않으니 해당 주소로 이동했다.

스크롤을 내리다보면 수상해보이는 코멘트를 발견했다.
sleep 함수를 부르고나서 IsDebuggerPresent라는 함수를 호출한다. 아무래도 IsDebuggerPresent라는 함수가 수상하다.

중단점을 걸고 계속 살펴보니, IsDebuggerPresent 함수가 실행되기 전까지 EAX는 0의 값을 갖고 있었는데, 실행 후에는 1의 값을 갖는다.

EAX의 값을 0으로 설정해주고 계속 돌려보았더니, JE에서 정상을 출력하는 문구의 주소로 보내주었다.

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


Basic RCE L05

이번에는 등록키를 찾는 문제.

5번의 exe 파일을 실행하면 나타나는 창이다.

Register now ! 를 누르면 뜨는 창.

Quit the CrackMe를 누르면 뜨는 창. 그리고 창이 꺼진다.

실행창으로 이동해서 f8을 계속 눌러보았지만 별다른 차도를 보이지 않았고, comment를 눈으로 훑어보아도 차도가 없었다.

풀이를 참고해보니 PEiD툴로 해당 파일을 열어보면 Pack되어있다고 한다. UPX로 언팩을 거쳐야 하는듯.

언팩을 거치면 델파이로 만들어진 프로그램으로 이후 디버거로 열어볼 수 있다.

문자열을 살펴보면 신경쓰이는 게 한 두개가 아니다. GFX-754-IER-954가 적혀있는 주소로 이동해보자.

코드를 확인하면 사용자가 입력한 name과 password가 EAX에 차례대로 저장되는 것 같다.

혹시나 하고 두 문구를 입력해보니까 축하한다는 문구가 떴다. 아마도 문제를 푼 것 같다.

왜 이렇게 되는지 모르겠어서 해설을 참고했다.

https://github.com/codeengn/codeengn-challenges-writeups/blob/master/RCE_Basic/L05/RCE%20Basic%20L05%20Report%20%5B4z320%5D.pdf

Registered User 이후에 CALL 하는 함수 내부로 들어가면 문자의 공백도 확인하고, count로 무문자열도 확인하는듯 하다.
아마도 유저가 넣은 문구가 올바른 문구인지 검사하는것 같다.

이후 GFX-754-IER-954가 입력된 이후에도 CALL하는 함수의 내부로 들어가면 역시 비교하는 구문이 들어있다고 한다.

따라서 Registered UserGFX-754-IER-954 올바른 값인듯 하다.


Basic RCE L06

6번 문제는 시리얼을 찾는 문제이다. 아예 언팩을 하라고 제시되어 있다.


6번의 exe 파일 실행시 나타나는 창.

잘못된 값을 입력하면 나타나는 창.

UPX를 이용하여 언팩해주었다.
그런데 언팩한 것과 안한 차이를 크게는 느끼지 못하겠는데, 언패킹해주면 진짜 실행 위치를 알 수 있다는 것 같다.

일단은 00401360이 엔트리 포인트인 걸로 보아 여기가 OEP인듯 하다.

f8로 진행을 하다가 실행창이 뜨니 더이상 f8로 진행이 불가능하다. CALL한 함수로 들어가보았다.

아무래도 내가 입력한 문자열과 정답을 비교하는 것 같다. 그렇다면 시리얼 문구는 AD46DFS547인듯 하다.

OED는 00401360, 시리얼 문구는 AD46DFS547이므로 6번 문제의 정답은 00401360AD46DFS547이다.

profile
공부중

0개의 댓글