Codeengn Advance 2 풀이.
Link ==> https://codeengn.com/challenges/advance/02
정답은 무엇인가.... 뭔가 심오하다.
일단 파일을 다운로드 받아본다.
PW를 입력하라는 창이 뜨고, 임의로 입력하고 엔터를 누르니까 프로그램이 꺼진다.
일단 Exeinfo PE로 분석해본다.
일단 특별한 패킹은 안 되어 있는 상태이고 C++로 만들어졌다고 나온다.
뭘 써도 상관없는데 OllyDbg라고 써 있으니 OllyDbg로 파일을 열어서 아까 창에서 봤던
문구열을 찾아본다.
OllyDbg 실행.
오른쪽 마우스 => Search for - All referenced text strings. 클릭.
잘 보이게 빨간색으로 표시한 부분을 보면 우리가 02.exe를 실행했을 때 등장했던 문자열들이 있는 걸 확인 가능.
저 빨간 부분을 실행해보면 "Enter Password:" 를 출력하고 CALL 02.00402010을 봐도 알 수 있고,
즉 004012D2에서 사용자 입력 값을 받는 것을 확인 가능 O.
일단 좀 더 코드 실행.
004013C5에서 CALL EDX를 불러서 프로그램이 종료.
F7를 눌러서 좀 더 들어가본다.
빨간색 코드 부분을 한 줄 씩 실행해보면 CMP를 이용해 ECX와 특정 값을 비교하고 있다.
CMP 부분으로 가고 ECX 값 확인.
EAX는 입력 시리얼 값이고 ECX는 0000041인 걸 보고 41인 걸 확인 가능.
CMP을 보면 41이랑 43이랑 비교한다고 하니까 비교해서 ZF가 0이면 JNZ에 의해 18FF8A로
점프하게 된다.
18FF8A로 가면 ECX를 호출하게 되서 프로그램이 종료.
빨간 부분을 보면 57 45 4C 4C 20 44 4F 4E 45 21을 넣는다는 사실을 알 수 있다.
ASCiII Code로 보면 W E L L 공백 D O N E !
이건 아마 문제를 풀면 나오는 문자인 거 같다.
여기서 중요한 것은 JE SHORT 0018F839라는 것이 나온다.
무엇일까.......?
좀 더 집중적으로 본다.
집중적으로 보니 성공 문자열을 만드는 코드.
즉 JE SHORT 0018F839에서 JUMP해야 한다.
'
다시 보면 첫번째 CMP는 ECX와 43 비교.
ECX는 41, 41은 ASCII Code로 A.
다시 말해 EAX를 보면 ASCII "A12"의 첫번 째 값.
PW의 첫 번째 글자와 43을 비교하는 것임을 알 수 O.
ECX를 43으로 수정해본다.
2번째 CMP에 걸렸을 때 ECX 값.
ECX는 31, ===> ASCII Code로는 1.
그럼 CMP로 비교하는 구문을 찾아본다.
위 캡쳐 중에 CMP ECX 이라고 써 있는 것을 의미.
43 52 41 41 41 43 4B 45 44 21 ==> ASCII Code로 바꿔 보면 CRAAACKED!
PW는 CRAAACKED!
인증(Auth)해본다.
'# Related site issues > CODEENGN' 카테고리의 다른 글
Codeengn Advance 5 (0) | 2018.05.17 |
---|---|
Codeengn Advance 3 (0) | 2018.05.17 |
Codeengn Advance 1 (0) | 2018.05.17 |
Codeengn Challenges = Basic 20. (0) | 2018.04.03 |
Codeengn Challenges = Basic 19. (0) | 2018.04.03 |