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

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

name이 CodeEngn일때 serial를 구하라는군요. bruteforce가 필요하답니다.

bruteforce는 무차별 대입이란 뜻을 가지고 있습니다. 이는 암호를 알아내기 위해 암호가 될만한 것들을 전부 대입해본다는 뜻이지요. 만약 암호가 4자리라면 0000 0001 0002 부터 시작해서 9999까지 전부 대입해서 암호를 알아냅니다. 이것을 무차별 대입이라고 합니다.

자 그럼 일단 프로그램을 실행시켜 봅시다.

음 창이 하나 뜨는군요. CHECK를 눌러봅시다.

1글자 이상을 채우라고 하네요. 그럼 채워 봅시다.

시리얼이 틀렸다면서 다시 시도하라고 나오네요. 올리디버그로 열어봅시다.

재생버튼을 눌러봅시다.

PUSHAD명령어가 있군요. 앞의 문제에서 설명했다시피 패킹된 파일인 것 같습니다.

확인을 위해 PEiD를 열어서 봅시다.

UPX로 패킹이 된 것을 알 수 있습니다.

UPX로 패킹된 파일은 맨 마지막 줄에 OEP로 갈 수 있도록 표시를 해놓습니다. 어디 한번 찾아봅시다.

마지막 줄을 보시면 특정주소로 점프시키는 명령어가 있습니다. 한번 가봅시다.

눌러주시면

알 수 없는 글자가 뭐라고 뜹니다. 재생버튼을 한번 눌러줍시다.

네 문자열이 보이는 걸로 보아 언패킹 된 부분이 나온것 같습니다.

쭉 내려봅시다.

내리시면 아래와 같은 부분이 나옵니다.


두개의 메세지 박스가 나오는데 하나는 good job이라 뜨고 하나는 아까 보신 실패한 문구가 적혀있습니다. 우리는 시리얼을 찾아야 하므로 성공부분을 자세히 봅시다.








'codeengn' 카테고리의 다른 글

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


안녕하세요. 오늘은 basic rce level 13을 풀어보겠습니다.

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

정답을 찾으라는군요. 파일을 열어 봅시다.

 

패스워드를 입력하라네요. 올리디버그로 열어봅시다.

그런데 올리디버그로 여니까 바로 실행이 되는군요. 그래서 프로그램을 닫았더니

 위와 같은 메세지가 뜨면서

올리디버그의 내용이 사라져 버립니다. 아무래도 올리디버그론 풀 수 없는 문제인 것 같습니다. 이럴땐 어떻게 해야 할까요?

일단 이 프로그램이 어떤 언어로 짜였는지 어떤 패커로 패킹했는지 알아내야 합니다. 이럴 땐 프로그램을 사용하면 간단하게 알아 낼 수 있습니다. PEID란 프로그램을 사용해 봅시다.

사용법은 정말 간단합니다. 그냥 ^^^를 눌러 알아볼 파일을 열어주시면 됩니다.

밑에 보시면 net을 이용하는 마이크로소프트 C#으로 제작이 된 것 같습니다.

visual이 쓰인걸로 보아 visual c#로 컴파일 된것 같습니다. 컴파일이라는 것은 인간이 작성한 고급언어를 컴퓨터가 알 수 있는 기계어로 번역시키는 것을 의미합니다. 하지만 우리는 기계어를 모르기 때문에 우리가 알 수 있는 고급언어로 번역시켜 줄 필요가 있습니다. 기계어를 고급언어로 번역시키는 것을 디컴파일 이라고 합니다. 디컴파일 프로그램을 사용해 봅시다.

여러가지 프로그램이 있지만 이번문제에서는 널리 알려진 C# .NET DecompilerReflector을 사용해 보겠습니다.

실행을 했으면 가져올 파일을 선택 후 리플렉터 안으로 드래그 앤 드롭을 해주시면 됩니다.

그러면 밑에 하나가 추가되는 것을 볼 수 있습니다.

+버튼을 눌러 세분화를 시켜보면 Main소스부분이 나옵니다.

소스를 확인했으면 위로 올라가 오른쪽 마우스를 눌러 disassemble를 눌러주세요. 디셈블을 하는 것입니다.

그리고 저장합시다. export를 눌러줍시다.

그리고 start를 눌러주시면 해당 경로에 파일이 저장됩니다.

완료되었으면 경로를 복사해 아무폴더주소에 붙여주시면 됩니다.

그러면 아래와 같이 파일이 뜹니다. 확인하셨으면 이제 파일을 열어봐야 겠지요?

확장자가 cs이므로 c#파일입니다. 파일을 여시면

위와 같이 소스가 뜹니다. 밑에 보시면 readLine와 plainText가 같을 경우 성공문자열이 나온다는군요. 우리는 정답을 알아내야 합니다. 위쪽을 보시면 plainText에 무언가를 저장시키네요. 그 값을 알기 위해 우리는 plainText를 출력해 볼 필요가 있습니다.

다음과 같이 입력해주시면

프로그램 실행시 위와 같이 정답이 뜨는 것을 알 수 있습니다.

 

 인증을 해보면

네 정답이 맞는 것 같습니다. 이것으로 문제풀이를 마치겠습니다.

'codeengn' 카테고리의 다른 글

codeengn - basic rce level 15  (0) 2015.08.18
codeengn - basic rce level 14  (0) 2015.08.18
codeengn - basic rce level 12  (0) 2015.08.12
codeengn - basic rce level 11  (0) 2015.08.12
codeengn - basic rce level 10  (0) 2015.08.05
Posted by englishmath
,

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

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


key값과 주소영역을 찾으라는 군요. 

파일을 받아 열어봅시다.

아무래도 key값을 알아내야 하는 모양입니다. 올리디버그로 열어봅시다.

패스워드나 key, 시리얼 값을 알아낼 때에는 문자열을 보시는 것이 좋습니다. 문자열을 한 번 봅시다.

위와 같이 보시면 올바른 키를 찾았다며 축하해주는 메세지가 있습니다. 더블클릭하여 자세히 봅시다.

문구의 위쪽에 보시면 CMP 비교함수가 있습니다. EAX와 7A2896BF를 비교한다는군요.

즉 EAX-7A2896BF를 해서 0이 나오면 jnz가 인식하고 바로 아래로 넘어갑니다.

만약 위의 차가 0이 아니라면 jnz는 성공문자열을 뛰어넘은 00401098로 이동시켜줄 것입니다.

그렇다면 EAX값은 얼마가 되어야 할까요? 7A2896BF를 빼서 0이 나와야 하니 EAX값은 7A2896BF가 되겠지요. 7A2896BF은 16진수이므로 10진수로 고쳐줍시다. 2049480383가 나오네요. 그러면 이제 EAX가 뭔지 알아야겠죠? cmp 부분에 브레이크를 걸고 프로그램을 실행시켜 10이란 값을 넣어보겠습니다.

check버튼을 누르셨으면 이제 CMP쪽에 멈출것입니다.

EAX값을 확인해 봅시다.

A가 나오네요. 입력한 값이 EAX값인 것을 알 수 있습니다.

그러면 이제 다시 실행시켜 2049480383를 입력해 봅시다.

성공메세지가 나오는군요. key 값은 2049480383입니다. 그런데 이 성공메세지 대신 key값이 나오도록 hexedit로 수정하라는 군요. hexedit로 열어봅시다.

성공메세지가 있는 쪽을 블럭잡았습니다.

수정시켜 줍시다. 문제는 값을 넣을때 16진수아스키코드를 넣어야 합니다.

즉 2라는 값을 넣을 때에는 그에 맞는 16진수아스키코드인 32를 넣어줘야 합니다.

그럼 차례대로 넣어봅시다.

차례대로 넣고 남은 부분은 그냥 0으로 채워주시면 됩니다. 자 그러면 이제 0x???? ~ 0x????의 값을 알아내야겠죠?

열을 보시면 총 16개가 있습니다. 그리고 번호는 이렇습니다.

0 1 2 3 4 5 6 7 8 9 A B C D E F

32부터 시작하므로 00000D30의 B 즉 000000D3B가 시작점입니다. 0x????라고 표현했으니까 4자리만 뽑아오면 0x0D3B가 됩니다.

자 그러면 끝은 어디일까요? 보통 정상적으로 33이 끝이라고 생각합니다. 하지만 여기엔 Null이 있습니다. 문자열의 끝을 알리는 Null은 16진수로 00을 의미합니다. 즉 끝은 33이 아닌 Null을 포함한 00. 즉 0D45가 마지막입니다.

그러면 영역은 0D3B ~ 0D45 까지 입니다. key값은 2049480383이므로

합치면 20494803830D3B0D45입니다. 인증을 해 봅시다.

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

'codeengn' 카테고리의 다른 글

codeengn - basic rce level 14  (0) 2015.08.18
codeengn - basic rce level 13  (0) 2015.08.12
codeengn - basic rce level 11  (0) 2015.08.12
codeengn - basic rce level 10  (0) 2015.08.05
codeengn - basic rce level9  (0) 2015.08.05
Posted by englishmath
,