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

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

OEP와 stolenbyte를 찾으라네요. stolenbyte는 앞서 문제에서 한번 봤지만 한 번 더 설명하면 훔쳐진 바이트입니다.

자 그러면 파일을 받아 봅시다.

어디서 많이 본 문구네요. 음 한번 올리디버그로 열어 봅시다.

맨 위가 pushad로 되어있네요. 패킹되었을 확률이 높습니다. 앞서 level 10에서 설명드렸다 시피 pushad로 패킹된 프로그램은 popad로 풀었을 수도 있습니다. popad를 찾아봅시다.

오른쪽 마우스를 눌러 다음과 같이 들어갑니다.

 popad를 쳐주시고 find를 눌러줍시다.

 딱 한개가 나오는군요, 한번 더블클릭 해줍시다.

OEP를 알아내기 위해 전부 브레이크를 걸고 실행해보겠습니다.

실행을 하시면 아래와 같이 문자열이 뜨는군요.

계속 실행을 해봅시다. 중간에 반복되는 부분이 있군요. 그래서 반복되는 부분은 브레이크를 해제하게습니다.

맨마지막 줄까지 왔습니다. 이제 맨마지막줄을 실행해봅시다.

맨마지막줄까지 하니 프로그램이 실행되는 것을 볼 수 있습니다. 즉 맨마지막에 보시면 JMP 0040100C 라고 적혀있는 걸로 보아 0040100C가 OEP라고 볼 수 있습니다. OEP를 한번 봅시다. 오른쪽 마우스 follow를 눌러줍시다

.

음 뭐라고 하는지 모르겠네요. 실행버튼을 눌러줍시다.

예 지금 보니까 0040100C에서 시작하는 것이 확실해 지는군요. OEP는 0040100C입니다.

그리고 이젠 stolenbyte를 찾아야 합니다.stolenbyte는 훔친 바이트란 뜻이죠. 즉 빼돌린 바이트를 의미합니다. 지금 OEP부분에서 빠진 것이 보이나요?
그렇죠. 문자열 하나가 빠졌습니다. 어떤 문자열일까요?

이 문자열이 빠졌습니다. 그러면? 이 문자열을 찾아야겠죠. 오른쪽 마우스를 눌러 아래와 같이 들어갑시다.

 눌러주시면 아래와 같은 그림이 뜹니다.

빠진 문자열이 보이는군요. 더블클릭 해줍시다.

빠진 문자열은 두개이지만 앞서 문제에서 앞의 PUSH 0까지 넣었던 적이 있었기 때문에 이번에도 넣어서 해보겠습니다. stolenbyte는 6A0068002040006812204000입니다.

OEP까지 넣어야 하므로 0040100C6A0068002040006812204000 이겠네요. 한번 인증해 봅시다.

아니라는군요. 그렇다면 앞의 PUSH 0을 빼봅시다.

0040100C68002040006812204000을 인증해봅시다. 그런데? 이것도 안됩니다. 뭐가 잘못됐나 하면서 계속 헤맸습니다. 그리고 몇번의 삽질 후에 저는 OEP가 틀렸다는 것을 알 수 있었습니다.

0040100C위쪽을 보시면 NOP라고 나와있습니다. 그런데 NOP가 원래 아무 뜻도 없지만 하나당 1바이트를 차지합니다. 총 세어보니 12바이트가 나오더군요. 그런데? 앞의 6A0068002040006812204000을 1바이트씩 나누어보면

6A 00 68 00 20 40 00 68 12 20 40 00 총 이렇게 12개가 나옵니다. 그렇다는 것은 원래 NOP부분에 이 stolenbyte가 들어가져 있었다는 뜻이 됩니다.

만약 원래로 복구시킨다면 실질적 OEP는 0040100C가 아닌 00401000이 되겠지요. 00401000을 넣어서 해봅시다.

004010006A0068002040006812204000을 입력해줍시다.

다음문제로 넘어가는 것으로 보아 정답인 것 같습니다.

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

'codeengn' 카테고리의 다른 글

codeengn - basic rce level 13  (0) 2015.08.12
codeengn - basic rce level 12  (0) 2015.08.12
codeengn - basic rce level 10  (0) 2015.08.05
codeengn - basic rce level9  (0) 2015.08.05
codeengn - basic rce level 8  (0) 2015.08.05
Posted by englishmath
,

안녕하세요. 오늘은 codeengn level 10을 풀어보겠습니다.

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

OEP를 구한 후 등록성공으로 가는 분기점의 OPCODE를 구하라네요. OEP는 앞서 설명한 시작위치를 말합니다. 그러면 파일을 받아 봅시다.

실행시키면 위와 같은 창이 뜹니다. 그런데 입력칸에 아무것도 입력이 안되어지네요. 그리고 빨간글씨로 등록되지 않았다며 다시 시도하라고 적혀있습니다. 일단 올리디버그로 열어봅시다.

여기서 재생버튼을 함 눌러봅시다.

실행화면이 달라졌습니다. 일단 OEP를 찾아보겠습니다.

아무데나 브레이커를 걸고 해보았습니다.

그런데 맨 첫번째 문장에 브레이크를 걸고 실행시켰는데도 실행이 되더군요. 게다가 프로그램조차 제대로 실행이 되지 않습니다. 그리고 실행시키자마자 또 실행화면이 달라지는 것을 볼 수 있습니다.

그래서 아래와 같이 브레이커를 걸고 다시프로그램을 열어 실행시켰습니다. 다시 프로그램을 실행시켜도 브레이커는 남아있으니까요.

그런데 브레이크를 걸고 다시 실행시켜보니 브레이커가 없어졌습니다. 이러면 곤란합니다...

OEP를 찾아야 하는데 실행된 위치를 못찾으니 찾을 수가 없습니다.

그래서 프로그램을 다시 열었습니다.

그런데 프로그램을 열때마다 계속 이런 창이 뜨는군요. 처음에는 무시해도 파일이 열려서 별 대수롭지 않게 생각했지만 지금 보니까 의미심장합니다.

그래서 이 에러가 뜨는 이유를 알아보았습니다.

이유는 두가지가 나왔습니다.

1. 올리디버그가 64bit와 잘 호환이 되지 않기 때문

2. 이 파일이 패킹되어있기 때문입니다.

패킹이란 쉽게 말하면 압축입니다. 그런데 그냥파일을 압축하는 것이 아닌 실행파일을 압축하는 것을 의미합니다. 게다가 일반 파일을 압축하면 확장자가 zip으로 바뀌는 것에 비해 패킹은 압축을 해도 확장자가 그대로이고 또 바로 실행이 가능합니다. 일반압축이 용량을 줄이는데에 의의가 있다면 패킹은 용량도 줄이고 또 보호목적으로 암호화도 시킨답니다.

만약 이 오류가 뜨는 이유가 2번인 경우라고 봤을 경우 우리는 패킹을 푸는 작업 즉 언패킹을 해야 하는데 귀찮으니까 우리는 간단하게 풀어봅시다.

맨 첫줄을 보시면 PUSHAD라고 나와있습니다. 즉 패킹의 시작인 것입니다. 그런데 말입니다. PUSHAD로 패킹된 프로그램은 대부분 POPAD로 패킹을 풉니다. 즉 우리는 POPAD를 찾아줍시다. 아래와 같이 들어갑시다.

그리고 POPAD를 입력합니다.

FInd를 눌러주시면

정말 많이 나옵니다. 첫번째 것을 더블클릭해봅시다.

제일 먼저 나온 POPAD를 찾았습니다만

조금만 움직이니 바로 바껴버리는군요. 다시 들어가 두번째 POPAD를 눌러줍시다.

더블클릭

이번엔 맍는 것 같습니다. 움직여도 없어지지 않네요. 즉 저 POPAD이후로 패킹이 풀렸을 가능성이 있습니다. POPAD부터 브레이크를 걸고 실행시켜 봅시다.

위 사진은 실행시킨 사진입니다. 실행전과의 차이를 찾으셨나요?

밑에서 두번째 줄을 보시면 PUSH가 있습니다 이것이 처음엔 0이었는데 실행을 시키니 00445834라고 뜨는군요. 암튼 계속 실행해봅시다.

00445834가 스택에 입력되었습니다. 계속 실행시켜 봅시다.

놀랍게도 retn함수가 실행된 후 프로그램이 실행되는 것을 볼 수 있습니다.

retn은 그냥 되돌아가는 함수이니 별 상관은 없습니다. 그러면? 가장 최근에 스택을 입력한 00445834가 시작주소 즉 OEP임을 알 수 있습니다.

이제 OEP는 찾았는데 등록성공으로 가는 분기점의 OPCODE를 구하라는군요.

일단 OEP로 가봅시다.

도착했습니다만 조금만 움직이니 또 바뀌는군요.... 암튼 이번엔 문자열을 찾아봅시다.

성공의 문자열을 말입니다.

들어가셔서 맨 밑으로 내리시면

Registered... well done이 보이는군요. 등록이 성공되었다는 뜻입니다.

더블클릭을 해봅시다.

제대로 찾아온것 같군요. 우리는 여기서 OPCODE를 찾아야 합니다. OPCODE는 명령어를 뜻합니다. 즉 성공과 실패를 가르는 분기점에서 쓰인 명령어를 찾아야 된다는 것입니다.

제법 가까운데 있습니다.

Jnz short 10,0044552B 라고 적혀있네요.

Jnz는 조건점프입니다. zero flag의 값이 0이 아니면 점프하라는 소리입니다. zero flag란 두값을 비교했을 때 두값이 같으면 1이고 다르면 0을 반환합니다. 저기서는 10과 0044552B를 비교하겠군요. 0044552B주소에 있는 xor구문의 값이 10이 아니기 때문에 zero flag의 값은 0을 반환할 것이고 0이기 때문에 jnz는 점프를 하지 않고 그냥 넘어가 등록성공이란 문구를 출력하는것입니다. 만약 값이 1이 된다면 0044552B로 점프합니다. 0044552B가 비교 겸 점프위치가 되는 것이지요.

아무튼 OPCODE는 Jnz였습니다. 그런데 문제에 보시면 예시가 숫자로 되어있습니다.

그래서 주소로 적겠습니다.

OEP + OPCODE이므로

00445834 + 004454D4 인 00445834004454D4 가 되겠네요. 입력해봅시다.

.... 아니라네요.. 분명 OEP는 맞습니다. 그러면 OPCODE가 잘못되었다는건데...

주소값이 아닌 바이트값 7555를 넣어보겠습니다.

004458347555를 입력해봅시다.

인증해줍시다.

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









'codeengn' 카테고리의 다른 글

codeengn - basic rce level 12  (0) 2015.08.12
codeengn - basic rce level 11  (0) 2015.08.12
codeengn - basic rce level9  (0) 2015.08.05
codeengn - basic rce level 8  (0) 2015.08.05
codeengn - basic rce level 7  (0) 2015.08.03
Posted by englishmath
,

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

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

stolenByte를 구하세요. 라고 적혀 있군요.stolenByte란 직역하면 훔친 바이트란 뜻입니다. 여기서는 원래프로그램에서 훔쳐내어 다른 부분으로 옮겨진 코드를 의미합니다.파일을 받아 열어봅시다.


키파일을 못찾았다는군요. 올리디버그로 열어봅시다.

재생버튼을 한 번 눌러줍시다.

내용이 바뀌는 것이 보입니다. 일단 프로그램이 실행되는 부분인 OEP 부분을 찾아봅시다. 아래로 쭉 내려가서봅시다.

맨마지막줄에 브레이크를 걸고 실행을 해보니 실행이 안되었습니다. 그래서 그다음줄에 브레이크를 거로 해보니 실행이 되더군요. 즉 맨마지막줄에서 점프한 곳이 OEP일수 있습니다.

OEP로 가기 위해 맨마지막 줄에서 오른쪽 마우스를 눌러서 fallow로 들어갑시다.

OEP로 왔긴 왔습니다만 알아들을 수 없는 문구만 있습니다. 실행버튼을 한 번 눌러줍시다.

네 아무래도 여기가 시작부분인것 같습니다. 그런데? 다 한번 훑어보시면 빠진것이 하나 있습니다.

이 문구입니다. 위의 OEP부분을 보시면 well done 박스도 있고 error박스도 있는데 왜 처음뜨는 이박스가 보이지 않습니다. 그래서 이 문자열을 찾기 위해 아래와 같이 해보았습니다.

밑에 보시면 click OK to .... 라고 OEP부분에 없던 문자열이 나옵니다. 더블클릭해서 들어갑시다.

네 찾았습니다만 이문구는 OEP부분에 없었습니다. 그렇다면? 혹시 문제에서 말한 stolenByte가 이것들일 수 있습니다. OEP에서 훔쳐온 바이트 말입니다.

그래서 차례대로 68002040006812204000을 넣어보았습니다. 

아니라는군요. 흠... 아무래도 이것들 외의 stolenByte가 있는 모양입니다. 그런데 stolenByte부분을 보시면 push라고 되어있네요. push는 스택에 값을 넣는다는 의미입니다. 그런데 push가 stolenByte위에 하나 있네요. push 0 이라고 되어있습니다. 혹시 이것도 딱히 의미는 없지만 같이 빼온것이 아닐까 하는 생각이 드는군요.

그래서 위의 6A00까지 더한 6A0068002040006812204000을 넣어보았습니다.

인증을 해보겠습니다.

맞는 모양이네요. 아무래도 이번문제는 약간 때려맞춘 감이 조금 있습니다....

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

 





'codeengn' 카테고리의 다른 글

codeengn - basic rce level 11  (0) 2015.08.12
codeengn - basic rce level 10  (0) 2015.08.05
codeengn - basic rce level 8  (0) 2015.08.05
codeengn - basic rce level 7  (0) 2015.08.03
codeengn - basic rce level4  (0) 2015.07.20
Posted by englishmath
,

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

홈페이지로 들어가 level8을 눌러주세요.

OEP를 구하라는 군요.OEP란 정상적인 파일을 디버거로 제대로 디버깅했을때 시작하는 위치를 말합니다. Download를 눌러 파일을 받아봅시다.

계산기가 나오는군요. 무슨 의미일까요? 올리디버그로 열어봅시다.

열렸군요. 일단 재생버튼을 눌러봅시다.

재생버튼을 누르면 실행화면이 바뀌는 것이 보입니다. 실행시켜봅시다.

실행시키면 계산기가 실행되는 것이 보입니다. 우리는 실행되는 위치를 알아야 하므로 실행되는 부분을 찾아야 합니다. 중간중간에 브레이크를 해서 실행되는 위치가 어디인지 살펴봅시다. 몇번을 하다 보면 실행위치를 찾게 됩니다.

다음과 같이 브레이크를 걸었을 때 실행이 안됩니다. 즉 마지막 줄을 실행하기전까진 실행이 되지 않는단 소립니다. 그래서 바로 다음줄에 브레이크를 걸고 실행시켜 보았습니다.

다음과 같이 마지막줄 바로 다음줄에 브레이크를 거니 실행되는 것이 보였습니다.

즉 마지막 내용이 프로그램을 시작시키는 위치입니다. 마지막 줄의 내용을 보면

다음과 같이 되어있네요. OEP란 맨 왼쪽의 숫자를 의미하므로 01020DCB를 인증해봅시다.

되지가 않습니다. 그런데? 함수를 보시면 01012475로 점프하라고 되어있습니다. 아마 점프된 곳에서 실행되지 않을까 하는 생각이 드는군요. 그래서 01012475를 인증해보겠습니다.

인증을 해봅시다.

다음문제로 넘어가는 것을 보아 정답인 것 같습니다. 이번 문제는 앞의 문제보다 훨 쉽군요.

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

'codeengn' 카테고리의 다른 글

codeengn - basic rce level 10  (0) 2015.08.05
codeengn - basic rce level9  (0) 2015.08.05
codeengn - basic rce level 7  (0) 2015.08.03
codeengn - basic rce level4  (0) 2015.07.20
codeengn - bagic rce level3  (0) 2015.07.20
Posted by englishmath
,

안녕하세요. 오늘은 codeengn의 bagic rce level7을 풀어보겠습니다.

홈페이지로 들어가 codeengn bagic rce level7을 눌러주세요.



니가 입력한 시리얼은 올바르지 않다라고 뜨는군요. 또한 문제에서 보시면 c드라이브 이름이 CodeEngn일 경우 시리얼이 생성될때 CodeEngn은 어떤것으로 변경되는가 라고 나와있습니다. c드라이브 이름이 CodeEngn일 경우라고 했으니 c드라이브 이름을 바꿔줍시다. 

그리고 올리디버그로 열어봅시다.

일단 오류메세지박스가 뜨는 부분을 먼저 봅시다.

에러가 뜨는 박스와 well done박스가 보이는군요. 당연히 이런 갈림길박스 위에는 비교함수cmp가 있기 마련입니다. 위로 조금만 올라가서 비교함수를 봅시다.

그림의 맨위를 보시면 CMP EAX, 0 이 보입니다. CMP 함수는 CMP 변수,변수 로 형식이 되어있으며 앞의 변수에서 뒷변수를 뺀 값이 0이 나올 경우 참을 반환하는 함수입니다.

즉 저위에선 EAX-0=0이 되어야 참이 된다는 소리입니다. 참이 됐을 경우 밑의 JE Short에 의해 00401117로 이동하게 됩니다. 00401117은 보시면 아시겠지만 성공박스가 뜨는 곳입니다.

즉 우리는 EAX가 0이 되게 만들어 줘야 합니다. 일단 CMP함수에 F2번을 눌러 브레이크를 건 후 실행시켜 보았습니다.

보시다시피 EAX값이 1이 되어있군요. 그래서 CMP에서 거짓을 반환하기 때문에 에러박스가 뜨는 겁니다. 그런데? 위의 함수를 자세히 보시면 이상한 문구가 있습니다.

Enter your serial 문구가 있습니다.Enter your serial은 어디서 많이 보지 않았습니까?

네 바로 이 문구 입니다. 그리고 그밑에 L2C-5781EqfgEngn4562-ABEX가 있습니다.

딱봐도 시리얼로 보이는 숫자긴 합니다. 그리고 맨 위의 함수를 보시면 stringToAdd가 있군요. 직역을 해보니 문자를 추가한다 라는 뜻같네요. 즉 EqfgEngn4562-ABEX란 문자열에 L2C-5781을 추가한 것 같습니다. 그런데 EqfgEngn4562-ABEX이 문자열은 대체 어디서 온것일까요? 그래서 문자열을 일단 전부 보기로 했습니다.

오른쪽 마우스를 눌러 아래와 같이 들어가 모든 문자를 봅시다.

문구가 많군요. 위쪽의 두번째 줄을 보시면 EqfgEngn4562-ABEX가 보입니다. 더블클릭 해봅시다.

예상대로 4562-ABEX가 EqfgEngn에 추가된 문자열이었습니다. 그럼 EqfgEngn는 대체 어디서 왔을까요? 그러고보니 우리가 올리디버깅에 앞서 하드디스크 이름을 CodeEngn이라고 줬었죠. Engn이 같은 걸로 보아 CodeEngn이 변형된 이름은 아닐까하고 생각이 듭니다.

앞서 문제에서 시리얼이 생성될 때 CodeEngn이 바뀐다 했으므로 일단 시리얼처럼 보이는

L2C-5781EqfgEngn4562-ABEX를 넣어봅시다.

시리얼 넘버가 맞군요. 시리얼넘버가 생성된 것입니다. 그리고 생성될때 CodeEngn의 값이 바뀐다 했으니까 아무래도 바뀐 값은 EqfgEngn인 것 같습니다. 한번 인증해 봅시다.

codeengn사이트의 challenges - continue를 눌러 인증해봅시다.

다음문제로 넘어가는 걸 보아 정답인 것 같습니다.

이것으로 문제풀이를 마치겠습니다. EAX로 풀려다 이상하게 문제를 풀었네요. 쩝...

뒷정리로 하드디스크 이름은 원래대로 해놓읍시다.

'codeengn' 카테고리의 다른 글

codeengn - basic rce level9  (0) 2015.08.05
codeengn - basic rce level 8  (0) 2015.08.05
codeengn - basic rce level4  (0) 2015.07.20
codeengn - bagic rce level3  (0) 2015.07.20
codeengn - basic rce level2  (0) 2015.07.15
Posted by englishmath
,

 안녕하세요. 오늘은 basic rce level4를 풀어보도록 하겠습니다.

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

디버거를 탐지하는 함수 이름을 알아내라는군요. 일단 다운로드를 눌러 디버거 프로그램을 탐지하는 프로그램을 다운받아 실행시켜 봅시다.

음 정상이란 문구만 되풀이하여 출력되는군요. 올리디버그를 이용하여 프로그램을 열어봅시다.

재생버튼을 한번 눌러봅시다.

??? 그냥 실행했을때는 정상이라고 떴는데 올리디버그에서 실행하니 디버깅 당함이 반복되서 출력되는군요. 그러면 대체 어디서부터 디버깅당함이 뜨는걸까요?

F8키를 이용해 한줄씩 실행해 봅시다.

한줄씩 실행하다보면 어느 지점부터 숫자가 붉게 변하더니 디버깅당함을 출력하기 시작했습니다. 즉 숫자가 붉게 변한 시점에 디버깅 프로그램이 있다는 것입니다.

살펴보니 0040100F을 불러오고 난 후 바로 디버깅당함이 출력되었습니다. 즉 디버깅함수는 0040100F에 있다는 것을 알 수 있습니다.그래서 0040100F쪽으로 가보았습니다. 가보니까 0040100F에서 0040108B까지 묶여있다는 것을 알 수 있습니다. 그래서 0040100F에서  0040108B까지 찾아보았습니다. 그러자 함수가 2개 나왔습니다.

두개의 함수가 뜨는군요. Sleep랑 IsDebuggerPresent가 뜨네요. 함수이름에 디버거가 들어간다니 너무 수상하군요. 그래서 답칸에 입력해보겠습니다.

홈페이지 - challenges - continue로 들어가 칸에 한번 입력해봅시다.

다음문제가 출력되는걸로 보아 디버거를 탐지하는 함수가 맞는 것 같습니다.

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

'codeengn' 카테고리의 다른 글

codeengn - basic rce level 8  (0) 2015.08.05
codeengn - basic rce level 7  (0) 2015.08.03
codeengn - bagic rce level3  (0) 2015.07.20
codeengn - basic rce level2  (0) 2015.07.15
CodeEngn - basic rce level 1  (5) 2015.07.15
Posted by englishmath
,

안녕하세요. 오늘은 코드엔진 3번 문제를 풀어보겠습니다.

홈페이지로 들어가 bagic rce level3을 눌러주세요.

비주얼베이직에서 스트링 비교함수 이름을 알아내라는 군요.

일단 download를 눌러 받아봅시다.

이런 오류가 뜨는군요. 그래서 msvbvm50.dll를 다운받아 설치한 후 다시 실행시키자

다음과 같이 뜨는군요. 보시면 알겠지만 영어가 아니고 다른언어입니다. 그래서 대충해석해보자면 잔소리를 제거하라??? 라는 뜻일 수 있습니다. 물론 확실한 건 아닙니다.

확인을 누르면 다음과 같이 뜨네요. 일단 아무 문구나 넣어 봅시다.

error라는 말은 알아듣겠군요. 자 이제 프로그램의 동작원리를 보기 위해 올리디버그로 열어봅시다.

재생버튼을 눌러봅시다.

떳긴 떳습니다만 level1이랑 다르게 양이 정말 정말 장난아니게 많습니다. 그런데 우린 여기서 패스워드를 알아내야 합니다. 패스워드를 입력하면 성공했다는 문자열이 뜨겠지요. 하지만 양이 너무 많아요. 일일이 다 찾다간 참 힘듭니다. 이럴땐 간단하게 검색으로 찾아 봅시다. 다른 말로 우리는 문자열만 찾아서 뽑아내도록 해봅시다. 

오른쪽 마우스 - search for - all referenced strings를 눌러줍시다.

문자열을 참조하겠다 라는 뜻이죠.

누르시면 아래와 같은 문자열들이 정리되어 보여집니다.

쭉 보시다보면 거의 대부분이 ASCII코드인데 특이하게 UNICODE인 부분이 있습니다. 처음 나오는 UNICODE는 경로인것 같구요. 두번째 UNICODE부터 한 번 봅시다.

2G83G35Hs2

??? 딱봐도 패스워드처럼 보이네요. 일단 이 문구를 더블클릭 해봅시다.

밑의 문자열이 출력된다는군요. 한번 입력해봅시다.

Registrieren을 눌러줍시다.

danke는 고맙다 라는 뜻의 독일어입니다. 아무래도 패스워드가 맞는 모양이군요.

그런데 우리는 여기서 스트링 비교함수 이름을 알아야 됩니다. 아까 뽑아놓았던 문자열에서 밑으로 계속 내려가면 두번째 2G83G35Hs2가 나옵니다. 두번쨰2G83G35Hs2를 더블클릭해주세요.

바로 밑에 보시면 call 호출한다. vbastrcmp 함수를 라고 되어있네요.

여기서 vba는 비주얼베이직을 뜻합니다. 그럼? str은 string의 약자겠군요.

마지막으로 cmp는 비교함수입니다. 그러면? 답이 나왔군요.

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


'codeengn' 카테고리의 다른 글

codeengn - basic rce level 8  (0) 2015.08.05
codeengn - basic rce level 7  (0) 2015.08.03
codeengn - basic rce level4  (0) 2015.07.20
codeengn - basic rce level2  (0) 2015.07.15
CodeEngn - basic rce level 1  (5) 2015.07.15
Posted by englishmath
,

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

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

패스워드를 분석하라는군요. Download를 눌러주세요.

다 받았으면 실행을 시켜 봅시다.

이런 ollydbg로 열어 봅시다.

왓더 뻐...

뭘로 해도 안열리네요. 이럴때는 어떻게 하느냐구요? 보통 사람들은 이럴때 hex로 봅니다.

그냥 파일을 보는 것이 아닌 파일의 16진수 코드를 보는 것이지요. hex로 볼려면 간단한 프로그램으로 쉽게 볼 수 있습니다. winhex 프로그램을 설치하여 실행한 후 파일을 열어봅시다.

숫자는 머리 아프니 보지말고 오른쪽 것만 편히 봅시다. 근데 못알아듣는 문자만 나오네요.

좀더 내려봅시다

오 정상적인 문구가 나옵니다. 음 NOPE 실패했다..

try again 다시 시도한다.. Yeah 성공했다. Crackme #1  JK3FJZh 이건 뭔 뜻일까요?

더이상 자세한 설명은 생략하겠습니다. 설마 패스워드를 못찾으신건가요?

눈앞에 있는데요??? 영어숫자가 섞였는데요??

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


'codeengn' 카테고리의 다른 글

codeengn - basic rce level 8  (0) 2015.08.05
codeengn - basic rce level 7  (0) 2015.08.03
codeengn - basic rce level4  (0) 2015.07.20
codeengn - bagic rce level3  (0) 2015.07.20
CodeEngn - basic rce level 1  (5) 2015.07.15
Posted by englishmath
,

네 오늘은 코드엔진의 문제를 풀어보겠습니다.

http://codeengn.com/ 으로 들어가 challenges - start - basic rce의 level 1 문제를 클릭합니다. 이 사이트는 회원가입을 하지 않아도 됩니다.


음 문제가 나왓습니다. Author(저자)은 abex 이군요. HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가? 뭔 소리일까요? 일단 밑에 다운로드문구가 보입니다. 눌러서 파일을 받아 봅시다.

흠 한번 실행해 봅시다.


너의 하드를 CD-ROM으로 생각하도록 나를 만들어라. 즉 이프로그램을 만져서 저의 하드를 cd롬으로 인식시켜야 할 것 같습니다.

이것은 CD-ROM드라이브가 아니라고 뜨는 군요.

파일을 올리디버그로 열어봅시다.

OEP는 00401000이네요. 그림을 보시면 좌측에 빨간 글자로 된 함수를 보실 수 있습니다.

먼저 MessageBoxA함수를 살펴봅시다. 함수명만 봐도 하는 일이 딱 감이 옵니다. 메세지 박스를 띄워주는 함수이네요. 내용을 보면 아까 실행할 때 보였던 문자열이 보입니다.

Nah... This is not a CD-ROM Drive

드라이브가 CD-ROM이 아니라는 '실패' 문자열입니다. 그럼 반대로 성공 문자열도 있겠지요. 바로 밑에 있네요.

OK, I really think that your HD is a CD-ROM!

자 이쯤 에서 문제를 한번 체크 해 봅시다.

HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가?

즉 바꿔 말하면 성공문자열이 적힌 메세지박스함수를 실행시키기 위한 GetDriveTypeA의 리턴값을 구해라 라고 되겠네요.

GetDriveTypeA 함수 바로 다음 부분에 브레이크를 걸고 실행해 봅시다. 함수의 리턴값은 함수가 끝날때 반환되는 값이기 때문에 GetDriveTypeA함수를 호출하고 난 후 바로 멈추도록 브레이크를 걸었습니다. (브레이크를 걸고 실행하면 실행하다가 브레이크를 건 명령어를 실행하기 바로 전에 멈춥니다.)



정상적으로 함수가 호출되고 종료되었습니다. 반환값을 확인해 봅시다. 함수의 리턴값은 레지스터에 저장됩니다. 레지스터는 여러 레지스터가 있는데 일단 함수의 반환값은 EAX레지스터에 저장되는 것만 확인하시면 됩니다.

EAX값이 3으로 되어있네요. 즉 기본 GetDriveTypeA 함수의 반환값은 3입니다.

다만 이 반환값으론 성공문자열을 가지 못하고 실패 문자열로 가게 됩니다. 원인을 살펴보면 도중에 아래와 같은 명령어를 볼 수 있습니다.

명령어들을 살펴봅시다.

CMP [값1],[값2] = 값1과 값2를 비교하여 두 값이 같으면 1 다르면 0을 ZeroFlag에 대입합니다.
JE [주소] = ZeroFlag의 값이 1일 경우 해당 주소로 점프한다.

확인해봅시다. CMP 다음 명령문에 브레이크를 걸고 실행해봅시다.

 

CMP EAX,ESI 가 실행되었습니다. 레지스터 값을 확인해 봅시다.

함수의 반환값 즉 EAX레지스터의 값은 1, ESI 레지스터 값은 3, 1과 3은 다르므로      z(ZeroFlag)의 값은 0이 됩니다. z값이 0이 됨으로써 JE 명령문에서 점프를 하지 않고
그대로 실행함으로써 실패문자열이 출력됩니다.

우리가 원하는 성공문자열을 출력하기 위해서는 JE명령문에서 점프를 해야 합니다. 점프를 하기 위해선 ZF의 값을 1로 맞춰줄 필요가 있고  ZF가 1이 되기 위해선 EAX와 ESI의 값이 같아야 합니다.

EAX는 1이고 ESI는 3입니다.  이중 함수의 반환값은 EAX이고 EAX는 ESI보다 2작으므로 기본 함수 반환값(EAX)에 2를 더해서 5로 만들어줘 최종적으로 EAX와 ESI가 값이 3으로 통일되도록 만들어줍시다.

수정하는 방법은 EAX 값을 더블클릭 하면 됩니다.

성공적으로 수정했을 시 성공문자열이 출력됩니다. 그러면 정답은 성공으로 가는 EAX값 즉 5가 됩니다.

감사합니다.

'codeengn' 카테고리의 다른 글

codeengn - basic rce level 8  (0) 2015.08.05
codeengn - basic rce level 7  (0) 2015.08.03
codeengn - basic rce level4  (0) 2015.07.20
codeengn - bagic rce level3  (0) 2015.07.20
codeengn - basic rce level2  (0) 2015.07.15
Posted by englishmath
,