일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- leetcode125
- 문자열 조작
- leetcode 5
- Hortonworks Sandbox
- Hadoop
- leetcode
- leetcode 561
- webcrawler
- leetcode 344
- airflow docker
- docker로 airflow 설치하기
- 블로그 이전했어요
- MapReduce 실습
- 컴퓨터구조
- leetcode 49
- leetcode 238
- Python
- ctf-d
- leetcode 234
- leetcode 15
- 스파크 완벽 가이드
- 빅데이터를 지탱하는 기술
- wargame.kr
- 올바른 변수명 짓기
- 배열
- leetcode 819
- 머신러닝
- 데이터레이크와 데이터웨어하우스
- leetcode 121
- leetcode 937
- Today
- Total
HyeM
[1]abex' crackme #1 본문
#1. 문제
문제는 다음과 같다. 프로그램을 실행하면 다음과 같이 메시지 창이 뜨고, 확인버튼을 누르면 cd-rom이 아니라는 창이 뜨고 프로그램은 종료된다. 아마 cd-rom으로 인식되도록 해야 풀리는 문제로 보인다.
#2. 문제 풀이
첫번째 화면을 살펴보자.
1) 디버거로 실행하면 보이는 첫 화면이다. API함수들 이름이 보이는 것을 확인가능하다.
또한, 메시지 창에서 봤던 문자들도 보이고, ' YEAH! I really think that your HD is a CD-ROM!' 이라는 문구도 보인다. 왠지 쉽게 풀릴 가능성이 있어보인다.
F7과 F8로 코드들을 실행해보며 흐름을 살펴보자.
2) call <JMP.MesageBoxA>
코드를 보니 매개변수 4개를 스택에 역순으로 저장하고, MessageBoxA api함수를 호출하는 코드이다.
MessageBoxA함수는 메시지 박스를 출력해주는 api로 호출시, 필요한 매개변수는 다음과 같다.
자세한 정보는 공식 사이트에서 확인 가능하다.
docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxa
int MessageBoxA(
HWND hWnd, //핸들
LPCSTR lpText, //내용
LPCSTR lpCaption, //제목
UINT uType //박스타입
);
위의 어셈블리어 코드를 해석해보면,
제목은 "abex' 1st crackme'이고,
내용은 "Make me think your~" 으로 메시지 박스를 만들어 띄우는 것으로 보인다.
이제 다음 어셈블리 코드도 살펴보자.
3) 이번에도 call 명령어로 GetDriveTypeA api 함수를 호출하는 코드 이다.
드라이브의 루트 이름을 전달해주는 GetDriveTypeA함수의 파라미터는 다음과 같다.
자세한 정보는 공식 사이트에서 확인 가능하다.
docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea
UINT GetDriveTypeA(
LPCSTR lpRootPathName //드라이브의 루트디렉토리
);
이를 보면, call하기 전에 00401013번지에서 push 명령어로 c:\\문자열을 스택에 넣어 파라미터로 역할을 하는 것을 확인가능하다.이 함수로, 지금 내 드라이브가 무엇인지 알아내려고 하는거 같다. (이미 코드로 내 드라이브는 c로 정해져 있다.)
그리고 다음 코드들을 살펴보면, 분기 명령어로 인해, mesageBox로 출력되는 문자열이 달라지는 것을 확인가능하다.
4) je 01.40103D 명령어로 바뀌는 메시지 박스를 볼 수 있다.
조건을 만족하면, 제목은 'YEAH!'이고, 내용 'OK, I really ~' 인 메시지 박스를 만드는 코드 흐름을 갖는 것으로 보인다.
만약 조건을 만족하지 않으면, 'Error' 제목으로 메시지 박스가 띄워진다.
여기서 ERROR 대신에 YEAH라는 문구가 나와야되는데, 그러기 위해선
JE를 JNE로 바꾸어, 코드 흐름을 ERROR가 아닌 다른 곳으로 바꿀 수 있다.
(현재는 조건을 만족하지 않아서, je명령어를 실행하지 않고, error의 메시지 박스가 뜬다.)
스페이스바를 눌러 어셈블리를 jne바꾸게 되면 다음과 같이 YEAH라고 뜬다.
문제 풀기 성공이다!
'Study > Reversing' 카테고리의 다른 글
[2]PE구조&wow64 fs redirection + a (0) | 2020.09.20 |
---|---|
[1]호출규약 + wargame 정리 + a (0) | 2020.09.14 |
[1]Dreamhack_Rev 0번 문제 (0) | 2020.09.12 |
[0]Stack & StackFrame (0) | 2020.09.05 |
[0]32bit Register (0) | 2020.09.05 |