문제

"비주얼베이직에서 스트링 비교함수 이름은?"


풀이

문제가 참 직관적이다. 일단 검색을 하고 와보자 아래는 microsoft의 있는 API이다.

음.... 사쿠라인가 아닌가 확인들어간다. 문제는 동일하게 03.7z에 PE가 하나들어있는 형태이다.

아하 일단 DLL이 하나 필요한가 보다 MSVBVM50.DLL은 다운로드 받고 레지스트리에 등록시켜보자. 등록방법을 혹시모르는 사람은 더보기를 누르자

더보기

1. C:\Windows\SysWOW64 에 해당 DLL파일이동

2. 관리자권한 명령프롬포트(CMD)에 regsvr32 [등록할 dll] 입력

실행을 하면 약간의 불필요한 메시지박스와 함께 다음의 창을 만날 수 있다.

문자열을 입력하는 Regcode 텍스트박스에 "REDUCTO"를 입력하고 엔터해보자.

그렇군 저 "Error! Das Passwort ist falsch!"를 찾아가자(TMI로 저 언어는 독일어다.)

위 사진에서는 0x00402A27에서 "2G83G35Hs2"라는 상당히 수상한 문자열이 보인다. 일단 입력을 해보자

저런 잘 찾은 듯하다 바로 아래 0x00402A2F에서 vbaStrCmp함수를 호출한다. 으흠; 위 패는 사쿠라가 아닌듯 하다. 문자열비교함수 찾았다.

 

문제

"패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오"


풀이

01번문제와 동일하게 비밀번호가 걸린 압축파일 하나와 실행파일을 얻을 수 있다. 화이팅해서 디버거를 켜보자

화이팅좀 하려그랬는데, 파일이 깨졌다.ㅋㅋㅋㅋㅋㅋ 헤더의 손상이 의심은 되는데, PEVIEW로 한번 열어보자

역시 PEVIEW가 제대로 헤더를 분석하고 있지 못하다. 잠깐 이론적인 이야기로 정상적인 PE파일이라면 0x00000000 ~ 0x00000039까지 IMAGE_DOS_HEADER일것이고, 다음 0x000000D7까지 DOS_STUB일거고 다음부터 IMAGE_NT_HEADER를 가질 것이다. 여기서 IMAGE_NT_HEADER를 오프셋을 가리키는 IMAGE_DOS_HEADER의 마지막 WORD인 e_lfanew가 0x1000을 가리킨다... 응? 우리파일은 그정도 크기가 아니다.

조금 아래로 내려보면 ASCII코드로 정답인 JK3FJZH이 입력되어있다. 아쉽게 헤더복원의 문제는 아니었지만(아 그렇지 여긴 BASIC이다.) 좋은 문제였다.

 

 

문제

"HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가."


풀이

01.7z의 압축을 해제햐면 01.exe의 PE File하나를 얻을 수 있다. 해당프로그램은 "HD를 CD-Rom으로 인식시켜 주세요." 라는 의미심장한 말과 함께 종료된다.

디버거로 한번 까보자

이화면을 보게되니 다시금 RCE문제를 풀고있구나가 느껴진다. 그래...우선 사용되는 문자열인 "Make me think your HD is a CD-Rom"이 .data에 raw로 존재하기를 바라며 찾아가보자.

굿 어렵지 않게 문자을 찾을 수 있었다. 우선 MessageBoxA의 파라미터로 들어가는 Title "abex's 1st crackme"를 찾아가자(0x00401002)

어렵지 않게 메인코드로 들어올 수 있었다. 0x00401026 필드에 je명령어 (같을경우 -> ZF가 1일때) 가 있다. 우선 강제로 움직여보자

ZF를 강제로 1로만들어서 성공했을 때로 가보았다. 결과는 좋지못하다.

으흠; 특별한것은 보이지 않고, MessageBoxA의 파라미터만 바뀐다.

문제를 다시 읽어보자. 문제가 요구하는것은 GetDriveTypeA의 값이 무엇이 되냐는 것이다. 잠깐 API를 보고오자.

https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea

 

GetDriveTypeA function (fileapi.h) - Win32 apps

Determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive.

docs.microsoft.com

그렇다. DRVIE_CDROM의 값은 int 5이다. 정답또한 5가 될 것이다.


첫문제부터 난항을 겪었다. 역시 오랜만에 어셈블리어를 보니 기본적인 명령어 사용법도 제대로 기억이 안난다. 빨리 실력을 끌어올려야한다.

https://codeengn.com/

 

CodeEngn [코드엔진]

CodeEngn ReverseEngineering Conference

codeengn.com

 

워게임은 여러 분야가 있다. 네트워크 / 포렌식 / 웹 / 모바일 / MISC 등등등 컴퓨터를 전공으로 하고 있는 필자도 아직 모르는 문제가 많을 정도로 Tricky 하고 deep 한 분야라고 할 수 있겠다. 몇 번의 ctf대회를 출전하며, 별로 좋지 못한 성적만을 거두어 왔는데, 이유는 단순하게 1. 진심을 내고 떨어지는 것이 두려워서, 2. 리버싱을 할 줄 몰라서였다. 나뭇잎 책도 읽어보고 각지의 글들을 찾아다녔는데, 아직도 리버싱은 잘 모르겠다. 어셈블리만 보면 이제 눈이 하얘진다. 

 

가만히 앉아있다고 문제가 해결되지는 않는다. Crack Me를 푸는 것이 절대 실력 향상에 도움을 된다는 생각을 하지는 않지만, 내 길이 틀리지 않았다고 생각하고 싶어서 새로운 발걸음을 내디뎌 보려 한다. 빠르게, light 하게 끝내보자

+ Recent posts