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

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

또 시리얼이군요. 파일을 받아 봅시다.


이름을 입력하라는군요.

뭐 당연한 결과지요. 올리디버그로 열어 봅시다.

파일을 열고 재생버튼을 누른 다음 텍스트를 찾아봅시다.

Wrong password 라는 문자열이 보이는군요. 한번 들어가 봅시다.

Good 이라는 성공문자열과 Wrong 이라는 실패문자열이 있습니다. 그리고 그 위쪽에 CMP 비교구문이 있는 것을 알 수 있습니다.

EAX와 DWORD PTR SS:[EBP-3C]를 비교한다는 군요. DWORD PTR SS:[EBP-3C]는 메모리주소[EBP-3C]에 저장된 값을 의미합니다. EBP값에서 3C를 뺀 메모리주소에 저장된 값이라는 뜻입니다. 그리고 앞에 DWORD는 4byte를 의미합니다. 

그리고 밑에는 조건점프인 jnz가 있습니다. 비교함수의 두 변수값이 다를 경우 점프하지요. 지금 점프하는 주소를 보시면 실패문자열이 있는 주소입니다. 그렇기 때문에 jmz에서 점프하지 않아야 성공할 수 있습니다.

즉 EAX와 DWORD PTR SS:[EBP-3C]이 같으면 성공할 수 있습니다.

그러기 위해선 EAX와 EBP값이 뭔지를 알아낼 필요가 있습니다. CMP부분에 브레이크를 걸고 프로그램을 실행시켜 봅시다.

엔터를 쳐주시면 브레이크부분에 걸리게 됩니다.

EAX가 5인걸로 보아 패스워드 인 것 같습니다. Name은 문제에서 정해준 CodeEngn이므로 굳이 찾지 않아도 됩니다.

EBP값이 28FF48이군요. 여기에서 3C를 빼야 합니다. 16진수 계산하기 귀찮으니 그냥 계산기 씁시다.

계산기를 실행시킨 후 보기 - 프로그래머용 을 클릭하여 16진수를 계산합시다.

16진수 이므로 Hex로 바꿔주신 후 계산을 해주시면 28FF0C가 나오네요.

즉 메모리주소 28FF0C에 있는 값의 4byte를 EAX와 비교하겠네요. EAX와 같아야 성공문자열이 나오고 EAX는 메모리주소 28FF0C에 있는 값의 4byte이니 메모리주소 28FF0C에 있는 값의 4byte가 이번 문제의 정답이 되겠군요. 얼릉 메모리주소를 확인해봅시다. 아래와 같이 들어갑시다.

메모리 주소로 들어가셔서 뒤져보시면 아까 계산한 28FF0C주소를 찾으실 수 있습니다.

값은 97 0D C6 E4 C4 10 35 00 이네요. basic rce level 15에서 설명했듯이 메모리 주소는 리틀엔디언 방식으로 읽어주셔야 합니다. 즉

00 35 10 C4 E4 C6 0D 97 입니다. DWORD이므로 4byte를 들고 오면 E4C60D97이 됩니다.

즉 EAX값이 E4C60D97이 되어야 합니다. 그런데 밑의 실행결과를 보시면

패스워드에 10을 줬을 경우

EAX는 A가 되버립니다. 즉 EAX가 E4C60D97이 될려면 E4C60D97의 십진수 값을 입력해 주셔야 합니다.

설마 계산기 버려두고 힘들게 계산하지는 않겠죠?

E4C60D97을 입력 후 10진수로 바꿔주시면 3838184855가 나옵니다. 한번 확인해 봅시다.

맞다는군요. 인증하러 갑시다.

인증~

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





'codeengn' 카테고리의 다른 글

codeengn - basic rce level 20  (0) 2015.10.02
codeengn - basic rce level 19  (0) 2015.10.02
codeengn - basic rce level 18  (0) 2015.09.25
codeengn - basic rce level 17  (0) 2015.09.25
codeengn - basic rce level 15  (0) 2015.08.18
Posted by englishmath
,