Codeengn Challenges = Basic 01. 풀이
코드 엔진 사이트 ==> https://codeengn.com/
이 곳에 들어가서 문제를 풀면 된다.
FTZ, LOB와는 다른 Window Hacking쪽 문제 중에 하나인 Codeengn 문제를 풀어봤다.
이런 식으로 문제(?)가 주어졌다. Down을 눌러서 다운로드를 해봤다.
다운로드를 하면 ZIP 형태를 볼 수 있다. 압축을 풀고 Reverse_L01.exe를 눌러보았다.
확인을 눌러보았다.
당신의 HD가 CD-Rom이라고 생각하게 만드십시오라는 뜻이다. 뭘 말하는지 몰라서,
확인을 눌러봤다.
CD-ROM Drive가 아니라고 나왔다.
일단 올리디버거를 사용했다.
00400100E call<jmp,&user32.MessageBoxA> //
messageBoxA API 함수 선언 => 메시지 띄운다.
00401018 call <jmp,&KERNEL32.GETDriveTypeA>
GETDriveTypeA API 함수 선언 => 프로그램이 실행된 드라이브 정보 얻는다.
00401024 cmp eax,esi //EAX, ESI 레지스터 비교.
00401026 je short Reverse_0040103D 그 결과 같으면 00401030D 주소로 이동.
00401036 call <jmp. &USER32.MessageBoxA> 타이틀 :> error, 내용 :>
nah... this is not a CD-ROM Drive! 라는 메시지 창을 띄운다.
0040104B call <jmp. &USER32.MessageBoxA> // 성공했다는 메시지 창을 띄운다.
일단 0040104B에서 선언하는 메시지 창이 중요하다.
그러기 위해서는 00401024에서 EAX = ESI
올리디버거는 F7,F8의 기능이 있다.
F7,F8은 한번 누를 때 마다 한 줄씩 내려가면서 실행과정을 확인 가능한데, F7은 함수 안으로 들어가서, 한 줄씩 모두 실행해보고, F8은 안쪽 부분은 자동으로, 밖 부분은 한 줄씩 실행. API 함수 아직 잘 모르니까 F8 이용해서 함수 밖 부분으로 분석 해보겠다.
한 번 00401018에 있는 GETDRIVETYPEA함수이므로, F8눌러서 실행.
오른쪽에 있는 레지스터창에 EAX 값이 바뀌고, GETDRIVETYPEA의 리턴 값이 EAX에 대입된다. 일단 1번이니까 좀 더 자세히 보면, INC와 DEC라는 명령이 보이는데 이건 한마디로 쓰레기 코드라고 한다.
0040101D주소부터 00401026까지 ESI와 EAX 레지스터의 변화량이 나오는데 ESI는 3이 증가, EAX는 2가 감소한다. CD-ROM이라 인식되기 위한 리턴값인 X-2와 ESI의 값인 3을 비교하고 같으면 0040103D로 점프한다는 것을 알 수 있다.
즉 항상 실패가 아니라 성공하기 위해서는 EAX와 ESI의 값이 같을 때만 아니라 항상 0040103D 주소로 이동을 해야 되니까 JE를 JMP로 바꿔주면 된다.
참고로 소스를 바꾸는 방법은 그 주소를 클릭해서 회색으로 바꾼다.
아래 그림으로 설명하겠다.
Assemble 창을 띄우고 원하는 명령으로 바꾸면 된다.
어쩄든 계속 풀이를 이어가면, JE를 JMP으로 바꾼 다음 명령 바꾼 부분을 포함되게 드래그 하고, 오른쪽 클릭 해서 COPY to execute => selection 누르면 새로운 창 뜬다.
새로운 창에서 Save file 누르고 원하는 이름으로 바꾼 후 실행하면 된다.
다시 EXE 파일을 눌러봤다.
'내가 정말 생각하기에는 너의 HD는 CD-ROM이 맞다'라는 말이 등장했다.
CF) 새로운 유형이라 당황했고, 좀 많이 생각해봐야 되는 문제 형태인 거 같다.
'# Related site issues > CODEENGN' 카테고리의 다른 글
Codeengn Challenges = Basic 06. (0) | 2018.03.28 |
---|---|
Codeengn Challenges = Basic 05. (0) | 2018.03.28 |
Codeengn Challenges = Basic 04. (0) | 2018.03.28 |
Codeengn Challenges = Basic 03. (0) | 2018.03.28 |
Codeengn Challenges = Basic 02. (0) | 2018.03.28 |
Codeengn Challenges = Basic 01. 풀이
코드 엔진 사이트 ==> https://codeengn.com/
이 곳에 들어가서 문제를 풀면 된다.
FTZ, LOB와는 다른 Window Hacking쪽 문제 중에 하나인 Codeengn 문제를 풀어봤다.
이런 식으로 문제(?)가 주어졌다. Down을 눌러서 다운로드를 해봤다.
다운로드를 하면 ZIP 형태를 볼 수 있다. 압축을 풀고 Reverse_L01.exe를 눌러보았다.
확인을 눌러보았다.
당신의 HD가 CD-Rom이라고 생각하게 만드십시오라는 뜻이다. 뭘 말하는지 몰라서,
확인을 눌러봤다.
CD-ROM Drive가 아니라고 나왔다.
일단 올리디버거를 사용했다.
00400100E call<jmp,&user32.MessageBoxA> //
messageBoxA API 함수 선언 => 메시지 띄운다.
00401018 call <jmp,&KERNEL32.GETDriveTypeA>
GETDriveTypeA API 함수 선언 => 프로그램이 실행된 드라이브 정보 얻는다.
00401024 cmp eax,esi //EAX, ESI 레지스터 비교.
00401026 je short Reverse_0040103D 그 결과 같으면 00401030D 주소로 이동.
00401036 call <jmp. &USER32.MessageBoxA> 타이틀 :> error, 내용 :>
nah... this is not a CD-ROM Drive! 라는 메시지 창을 띄운다.
0040104B call <jmp. &USER32.MessageBoxA> // 성공했다는 메시지 창을 띄운다.
일단 0040104B에서 선언하는 메시지 창이 중요하다.
그러기 위해서는 00401024에서 EAX = ESI
올리디버거는 F7,F8의 기능이 있다.
F7,F8은 한번 누를 때 마다 한 줄씩 내려가면서 실행과정을 확인 가능한데, F7은 함수 안으로 들어가서, 한 줄씩 모두 실행해보고, F8은 안쪽 부분은 자동으로, 밖 부분은 한 줄씩 실행. API 함수 아직 잘 모르니까 F8 이용해서 함수 밖 부분으로 분석 해보겠다.
한 번 00401018에 있는 GETDRIVETYPEA함수이므로, F8눌러서 실행.
오른쪽에 있는 레지스터창에 EAX 값이 바뀌고, GETDRIVETYPEA의 리턴 값이 EAX에 대입된다. 일단 1번이니까 좀 더 자세히 보면, INC와 DEC라는 명령이 보이는데 이건 한마디로 쓰레기 코드라고 한다.
0040101D주소부터 00401026까지 ESI와 EAX 레지스터의 변화량이 나오는데 ESI는 3이 증가, EAX는 2가 감소한다. CD-ROM이라 인식되기 위한 리턴값인 X-2와 ESI의 값인 3을 비교하고 같으면 0040103D로 점프한다는 것을 알 수 있다.
즉 항상 실패가 아니라 성공하기 위해서는 EAX와 ESI의 값이 같을 때만 아니라 항상 0040103D 주소로 이동을 해야 되니까 JE를 JMP로 바꿔주면 된다.
참고로 소스를 바꾸는 방법은 그 주소를 클릭해서 회색으로 바꾼다.
아래 그림으로 설명하겠다.
Assemble 창을 띄우고 원하는 명령으로 바꾸면 된다.
어쩄든 계속 풀이를 이어가면, JE를 JMP으로 바꾼 다음 명령 바꾼 부분을 포함되게 드래그 하고, 오른쪽 클릭 해서 COPY to execute => selection 누르면 새로운 창 뜬다.
새로운 창에서 Save file 누르고 원하는 이름으로 바꾼 후 실행하면 된다.
다시 EXE 파일을 눌러봤다.
'내가 정말 생각하기에는 너의 HD는 CD-ROM이 맞다'라는 말이 등장했다.
CF) 새로운 유형이라 당황했고, 좀 많이 생각해봐야 되는 문제 형태인 거 같다.
'# Related site issues > CODEENGN' 카테고리의 다른 글
Codeengn Challenges = Basic 06. (0) | 2018.03.28 |
---|---|
Codeengn Challenges = Basic 05. (0) | 2018.03.28 |
Codeengn Challenges = Basic 04. (0) | 2018.03.28 |
Codeengn Challenges = Basic 03. (0) | 2018.03.28 |
Codeengn Challenges = Basic 02. (0) | 2018.03.28 |