안녕하세요. 오늘은 basic rce level 15 문제를 풀어보겠습니다.

홈페이지로 들어가 basic rce level 15를 눌러주세요.

14번이랑 문제가 똑같군요. 일단 프로그램을 다운받아 봅시다.

이름과 시리얼 입력칸이 나왔습니다. 아무거나 입력해 봅시다.

다시 시도라하네요. 올리디버그로 열어봅시다.

재생버튼을 눌러줍시다.

pushad가 없는걸로 보아 패킷된 파일은 아닌것 같습니다. 그렇다면 바로 성공문자열을 찾아봅시다. 위와 같이 들어갑시다.

성공문자열은 모르겠지만 실패문자열은 잘 보이는군요. 더블클릭 해봅시다.

이러한 실패문자열이 있으면 당연히 성공과 실패가 나뉘는 부분이 있죠. 좀 위로 올라가시면 위 그림과 같이 CMP 부분이 보입니다.

EAX와 DWORD PTR DS:[45B844]를 비교한다네요.

PTR DS:[45B844]는 메모리주소[45B844]에 저장된 값을 의미합니다. 앞에 DWORD는 4byte를 의미합니다. WORD는 2byte이지요.

즉 정리하면 EAX와 메모리주소[45B844]에 저장된 4byte값이 같으면 성공한다 라고 보시면 되겠군요. 일단 EAX를 찾읍시다.

CMP에 브레이크를 걸고 실행시켜서 아래와 같이 입력해봅시다.

Check it을 누르면 CMP부분의 브레이크에 걸립니다. 값을 확인합시다.

EAX가 2라고 나와있네요. 즉 serial은 EAX값입니다. 자 이제 문제를 풀어봅시다.

Name가 CodeEngn일때 라고 했으므로 CodeEngn을 써 줍시다.

그리고 check it을 눌러 브레이크 부분에 걸렸으면 아래와 같이 메모리주소를 확인합시다.

하단쪽을 보시면 아래 그림처럼 메모리주소창이 뜹니다.

그런데 여기서 주의하실점이 있습니다. 바로 메모리 덤프주소는 리틀 엔디언 방식으로 읽어주셔야 한다는 것입니다.

엔디언이란 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방식을 뜻합니다. 빅 엔디언, 리틀 엔디언, 미들 엔디언으로 나뉘어집니다.

빅 엔디언 방식은 큰 단위의 바이트가 앞에 오는 방식이고 리틀 엔디언 방식은 작은 단위의 바이트가 앞에 오는 방식을 뜻합니다.

자 그러면 어떻게 읽어야 할까요>

일단 주소를 들고 오면

60 61 00 00 09 00 00 00 입니다.

리틀 엔디언 방식으로 읽어야 하므로 작은 단위가 앞에 와야합니다. 바이트단위이므로 

00 00 00 09 00 00 61 60으로 읽어야 합니다.

DWORD이므로 4byte를 들고오면

00006160이 됩니다. 

즉 정리하면 EAX값은 16진수 6160값이 되어야 합니다.

근데 입력창은 10진수로 입력해야 하므로 16진수 6160을 10진수로 바꾸어 줍시다.

24928이로군요. 이 값을 프로그램에 넣어봅시다.

아무래도 정답이 맞는 것 같습니다. 그럼 인증을 해 봅시다.

정답이 맞는 것 같습니다.

네 이것으로 문제풀이를 마치겠습니다.




'codeengn' 카테고리의 다른 글

codeengn - basic rce level 18  (0) 2015.09.25
codeengn - basic rce level 17  (0) 2015.09.25
codeengn - basic rce level 14  (0) 2015.08.18
codeengn - basic rce level 13  (0) 2015.08.12
codeengn - basic rce level 12  (0) 2015.08.12
Posted by englishmath
,