Advance 04번 문제입니다.

프로그램에 문제와같이 codeengn 을 넣고 12345를 넣어보았습니다.

에러 메세지가 나옵니다..

디버거를 통해 열어보았습니다. 흠 시작부터 점프문으로 시작하는군요 한번 내려가보겠습니다.

밑으로 내려가면 저부분에서 다시 위로 올려버립니다. 저밑에 JMP문으로 가고싶은데 말입니다. 그래서 저는 JMP에 BP를걸고 F9로 넘어와 계속 진행하니 어떤 코드가 나왔는데 거기서 CTRL + A를 누르니 본코드가 나왔습니다.

위와같이 말입니다. 이제 쉽게 성공했다는 문구를 찾아가보도록 하겠습니다.

저는 우선 저부분이 비교하는 함수 IstrcmpA함수 가 있기때문에 BP를 걸고실행시켜 codeengn을 입력하고 12345를 넣어보니 저렇게 나왔습니다. 12345와 뭔가를 비교하는것 저것이 serial이라 생각하여 입력했더니 답이 아닌것입니다..

그래서 저는 차근차근 분석을 해보았습니다. 옆에 코멘트를 달면서 저기 JNZ까지는 아마도 NAME이 적혀있는가를 보는곳 같았습니다. 그밑에는 name에 따른 시리얼값을 만드는 곳이고 그 다음은 입력한 값과 시리얼값을 비교하는 함수였습니다. 의외로 문제는 가까운 곳에 있었습니다. 제가 입력한 부분은 'codeengn'에 대한 시리얼값을 비교한것이었고, 원래는 'CodeEngn'에 대한 시리얼값을 비교해야 했습니다. 그래서 저는 다시 CodeEngn 을 넣고 비교하니 답을 찾게되었습니다.


'Reversing > CodeEngn Advance' 카테고리의 다른 글

CodeEngn Advance 06  (0) 2015.08.23
CodeEngn Advance 05  (0) 2015.08.20
CodeEngn Advance 03  (0) 2015.08.15
CodeEngn Advance 02  (0) 2015.08.15
CodeEngn Advance 01  (0) 2015.08.15


Advance 03번 문제입니다.

디버거를 통해 열어 실패했다는 문자열로 달려가보았습니다. 문자열이 나오기 전인 저 부분에 BP를 걸고 실행시켜보았습니다.

프로그램이 실행되기에 적절한 값을 넣고 CHECK를 눌러보았습니다.

그렇게 쭉 내려오다보면 두 값을 비교하는 함수에 제가넣은값과 또 다른값이 비교되고있었습니다. 이값이 정답이 되겠습니다.


'Reversing > CodeEngn Advance' 카테고리의 다른 글

CodeEngn Advance 06  (0) 2015.08.23
CodeEngn Advance 05  (0) 2015.08.20
CodeEngn Advance 04  (0) 2015.08.20
CodeEngn Advance 02  (0) 2015.08.15
CodeEngn Advance 01  (0) 2015.08.15


Advance 02번 문제입니다.

파일을 실행시켜보았습니다. Enter Password: 라는 문자열이 있습니다. 아무거나 쳐보니 그냥 꺼져버렸습니다.

디버거를 통해 들어가보겠습니다.

Enter Password라는 문자열이 있는곳으로 이동하였습니다. 하나하나 실행시켜보며 입력함수 까지 찾아내었습니다.

마지막 입력함수를 실행시켜보니 이렇게 비밀번호를 입력할 수 있게 되어 12345를 넣어보았습니다.

그렇게 내려오다보면 어느샌가 반복하고있는 제가 보였습니다. 계속 위로 다시 점프를 시켜버리길래

그냥 맨밑에 점프문을 없애버렸습니다. 그렇게하니 자연스래 아래로 내려올 수 있게되었습니다.

그렇게 내려오다보면 이부분을 지나면 프로그램이 끝나게됩니다.

여기로 들어가보면 위와같은 수많은 CMP가 보일것입니다. 죄다 CMP 비교를 해서 아니면 저 아래로 점프시켜버립니다. 고로 저는 ECX값을 계속 맞춰주며 한글자씩 얻어간 끝에 답을 얻게 되었습니다.

'Reversing > CodeEngn Advance' 카테고리의 다른 글

CodeEngn Advance 06  (0) 2015.08.23
CodeEngn Advance 05  (0) 2015.08.20
CodeEngn Advance 04  (0) 2015.08.20
CodeEngn Advance 03  (0) 2015.08.15
CodeEngn Advance 01  (0) 2015.08.15


Basic을 끝내고 advance로 들어오게되었습니다.

파일은 패킹이 되어있는것 같습니다.

디버거로 한번 열어보았습니다.

언패킹을 하여 본래코드로 들어왔습니다.

분석을 하다보니 안티디버깅 함수가 존재하길래

우회를 해주었습니다.

이제 밀리세컨드안에 프로그램을 끝내버리는 함수를 찾아야하는데 베이직에서 푼 문제와 같은 함수가 여기 존재합니다. 이 함수들 중 하나겠죠

찾았습니다. CMP명령어를 보시면 EAX값과 ESI값을 비교하여 EAX값이 커야 점프를 하게됩니다.

바로 이부분입니다.

점프를 하게되면 EAX값과 ESI값을 연산시켜주는데 연산 시켜준 후 CMP를 하여 EAX값과 EBX+4값을 비교시켜줍니다. 만약에 EAX값이 더 크다면 끝이나는것입니다.

그렇다면 끝이나려면 EAX값이 EBX+4 값 보다 커야지 끝나게됩니다. 고로 EBX+4값이 정답이 되겠습니다.

'Reversing > CodeEngn Advance' 카테고리의 다른 글

CodeEngn Advance 06  (0) 2015.08.23
CodeEngn Advance 05  (0) 2015.08.20
CodeEngn Advance 04  (0) 2015.08.20
CodeEngn Advance 03  (0) 2015.08.15
CodeEngn Advance 02  (0) 2015.08.15


드디어!!!!!!!!!! 대망의 codeengn basic 의 마지막문제 20번을 풀었습니다!!!

우선 파일을 열었을때의 모습입니다.

crackme3.key파일이 있어야 한다해서 임의로 만들어 메모장으로 안의 내용도 채워보았습니다.

이제 디버거로 열어보겠습니다. 시작부터 createfile과 readfile이 보입니다. 

create파일은 파일이 있는지 보는 거겠고,

readfile은 아마 그 파일을 읽어주는 기능을 하겠는데 여기서 중요한게 있습니다. 바로 12라고 적혀있는 곳인데요 이 숫자를 변환해보면 바로 파일의크기가 18바이트가 되어야한다는 사실입니다. 그래서 파일의 크기를 우선 18바이트로 맞춰줘야 합니다.

그렇게 맞춰주면 CMP로 파일이 18바이트가 맞느냐 라고 검사를 하는데 손쉽게 통과할 수 있게됩니다. 그럼 점프문을 통과합니다.

이제 두번째 관문을 맞이했습니다. CALL으로 F7 스텝인투를 해보겠습니다.

CALL부분입니다 XOR연산자가 많습니다. XOR은 쉽게말해서 두 값이 같으면 0, 아니면 1이라고 생각하면편합니다. 우선 ECX값을 0으로 만들고 EAX값도 0으로 만들어버립니다.

ESI에 입력된 값이 들어오고 EBX의 끝에 두자리를 41로 바꾸는군요 참고로 41은 A입니다.

AL에도 입력값의 값을 넣는데 제가 만들때 시작을 'A11111...'로해서 A가 있기 때문에 AL에도 41이 들어갑니다.그러곤 XOR AL,BL입니다. AL도 41이고 BL도 41이니 당연히 0이되겠습니다. 그렇게 쭉쭉 내려와서 ADD연산자가 보입니다. EAX값이 현재 0이니 더해도 아무 변화가 없습니다. CMP AL,0을 하면 당연히 참이되겠습니다. 그렇게 점프를 합니다. 만약에 참이아니라면 CL을 1 증가시켜 처음으로 점프해서 다시내려오고 다시 올라가고 하는 방식이 반복되더군요...

위와같이 말입니다..

리턴을통해 나오게되면 이녀석이 기다리고있습니다. 제가 입력한 값과 12345678을 연산시키는것 같습니다. 이곳을통과하려면 0을 만들어야겠습니다. 여기에 보면 DS는 313131이라고 나옵니다 제가 바뀌는 부분을 알아보니 가장 마지막 4칸이 바뀌어야 한다는 것을 알게되었습니다.

여길 보면 알수있습니다.

그렇게 저는 여기를 CTRL+E 로 바꿔보았습니다.


이렇게 둘 다 12345678이 되었습니다 그렇게 점프를하지않고 또 통과할 수 있게됩니다.

그렇게 쭉 내려오다보면 우리가 봐야하는 문구가 달린 MESSAGEBOX를 찾게됩니다.

완료!!


'Reversing > CodeEngn Basic' 카테고리의 다른 글

CodeEngn Basic 19  (0) 2015.08.08
CodeEngn Basic 18  (0) 2015.08.08
CodeEngn Basic 17  (0) 2015.08.05
CodeEngn Basic 16  (0) 2015.08.05
CodeEngn Basic 15  (0) 2015.07.27


Istrcmp함수입니다. CodeEngn Basic 18번 에서 사용했던 함수입니다. 

영어를 한번 보시면 두개의 문자열을 비교하는 함수라는 소리같습니다. 


리턴타입은 int입니다

'Reversing > Function' 카테고리의 다른 글

strcomp함수  (0) 2015.08.20
timeGetTIME  (0) 2015.08.08


timeGetTime함수입니다. 바로 CodeEngn Basic 19번에서 다루었던 함수입니다. 

영어로 되어있는 것을 조금 풀어쓴다면 밀리세컨드 단위로서 윈도우가 우선 시작되고 난 후 부터 시스템의 시간을 재는 함수입니다. 

파라미터는 없는 함수이며 리턴값은 시스템시간을 밀리세컨드로 리턴하는 함수입니다.

'Reversing > Function' 카테고리의 다른 글

strcomp함수  (0) 2015.08.20
Istrcmp  (0) 2015.08.08


Basic 19번 문제입니다.

파일을 실행시켜본 화면입니다.

형식을보니 패킹이 되어있는것 같습니다.

디버거로 열어보았습니다. PUSHAD로 시작하는군요.

POPAD를 찾아 점프문을통해 점프 해보았습니다.

본 코드가 나왔습니다.

하다보니 안티디버깅 함수 IsDebuggerPresent함수가 나왔습니다.

손쉽게 처리해주시고 넘어갑니다.

문제를 풀다가 발견한 함수가 있는데 sleep함수와 이 timegettime함수였습니다. 몇개를 살펴보니 sleep함수와 timegettime함수가 같이있어야 한다해서 후보를 몇개 지워봤습니다. 그래서 찾은 부분이

이부분입니다. timegettime함수로 갔다가 sleep함수로 넘어와서 일정한 time이 지난후에 sleep함수로 가는 방식일거라 생각했습니다. 각각의 아래에 CALL EDI 도 눈에 띄었습니다.

그렇게 cmp eax,esi를 한 후에 점프를 하여 

다시 cmp명령어가 나옵니다. 아마도 여기의 2B70값의 10진수가 정답일거라 생각했는데 정답이었습니다. 

'Reversing > CodeEngn Basic' 카테고리의 다른 글

CodeEngn Basic 20  (0) 2015.08.09
CodeEngn Basic 18  (0) 2015.08.08
CodeEngn Basic 17  (0) 2015.08.05
CodeEngn Basic 16  (0) 2015.08.05
CodeEngn Basic 15  (0) 2015.07.27

+ Recent posts