CodeEngn Advance #2

2013. 10. 11. 22:36 from Wargame

Level 02

정답은 무엇인가 

 

정답은 무엇인가라는 문구와 함께 파일이 하나 있습니다.

파일을 한번 실행시켜 보니 다음과 같이 패스워드를 받더군요



올리로 까서 All referenced text strings를 통해 저 Enter Password가 있는곳으로 가봤습니다.



004012D2에서 사용자 값을 입력 받고 F8로 쭉 trace를 하다 보면 004013C5 call near edx를 호출한 뒤 프로그램이 종료되는 것을 알 수가 있습니다. 그래서 call near edx함수 내부로 들어가봤더니 다음과 같은 코드들이 존재하였습니다.

 


특정 값들을 ecx(우리가 입력한 문자열이 들어있음)의 한글자식 비교해서 같지 않다면

0012F88A라는 곳(프로그램을 종료시키는 함수가 존재하는 곳입니다)으로 분기하고 있습니다. 적절하게 코딩을 해주면 답이 나옵니다.





'Wargame' 카테고리의 다른 글

CodeEngn Advance #1  (0) 2013.10.11
Posted by xer0s :

CodeEngn Advance #1

2013. 10. 11. 22:32 from Wargame

Level 01

프로그램은 밀리세컨드 후에 종료 되는가 
정답인증은 MD5 해쉬값(대문자) 변환 인증하시오 

 

UPX패킹이 되었으므로 패킹으로 풀어주고 디버깅을 진행합니다.

몇 밀리세컨드 후에 종료 되냐고 물어봤으므로 시간관련 함수를 찾아보니 timeGetTime 함수가 있었습니다

BreakPoint를 걸어주고 실행해본 결과 다음과 같은 코드에서 브포가 걸렸습니다.

위 코드를 봐보면 우선 timeGetTime함수를 호출해서 반환된 eax값을 esi에 넣어줬습니다. 그리고 00444C5F call near edi timeGetTime 함수를 한번 더 호출해준뒤 그 값이 전에 호출한 timeGetTime 값보다 크거나 같을 경우 jnb 명령을 통해 00444D38로 분기하게 됩니다. jnb를 따라가보면 다음과 같은 코드가 나옵니다.

eax esi의 차이를 구해 그게 ebx+4(337B)값보다 크거나 같으면 분기하고 그렇지 않으면 push 0A를 해준뒤 sleep함수를 호출합니다. 아마 ebx+4의 값이 정답 될 거 같아 337B값을 10진수로 변환해준 뒤 그 값을 md5해주니 인증이 되었습니다.


'Wargame' 카테고리의 다른 글

CodeEngn Advance #2  (0) 2013.10.11
Posted by xer0s :

os 판별 코드

2013. 10. 11. 17:34 from Programming

자신이 사용중인 os가 window 7인지 아닌지를 판별해주는 프로그램을 짜봤다.

리버싱 문제낼때 언제 한번 써먹어야 겠다.



#include <stdio.h>

#include <tchar.h>

#include <Windows.h>


int _tmain(int argc, TCHAR *argv[])

{

OSVERSIONINFOEX osver = {0, };

osver.dwOSVersionInfoSize = sizeof(osver);

osver.dwMajorVersion = 6;

osver.dwMinorVersion = 1;

osver.dwPlatformId = VER_PLATFORM_WIN32s;


DWORDLONG dwlConditionMask = 0;

VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);

VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);

VER_SET_CONDITION(dwlConditionMask, VER_PLATFORMID, VER_EQUAL);


if(VerifyVersionInfo(&osver, VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID, dwlConditionMask))

_tprintf(TEXT("This system is Window 7\n"));

else

_tprintf(TEXT("This system is not Window 7\n"));


return 0;

}




'Programming' 카테고리의 다른 글

타이머 함수  (0) 2014.02.01
[dovelet]-crypt  (0) 2014.01.20
Binary Search  (0) 2013.07.18
좋은 사이트..  (0) 2013.07.13
c++ 급여 관리 시스템  (0) 2013.07.09
Posted by xer0s :