먼저 잘못 입력했을 때 이러한 메시지 창이 뜬다


이 메시지 창에 있는 문자열이 사용되는 부분을 올리디버거에서 검색해보니 이러한 부분이 나왔다.




아스키코드로 박혀있는 문자열 두 개가 눈에 띈다


Registered User GFX-???-???-???.


두 개의 문자열 이후 점프를 하는데 점프하는 부분을 보니 둘다 Wrong Serial이라는 부분으로 점프를 한다


그렇다면 두 부분에서 점프를 하지 못하도록 하면 될거같다


Unregistered... 부분에는 Registered User를 시리얼 부분에는 GFX-???-???-???를 입력해 주면 된다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 07  (0) 2017.01.10
CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 04  (0) 2017.01.10
CodeEngn Basic 03  (0) 2017.01.10
CodeEngn Basic 02  (0) 2017.01.10


먼저 실행파일을 실행해보니 정상이라고 1초마다 출력이 된다. 그러나 올리디버거로 실행시켰을 때 디버깅 당함이라고 출력이 된다.



올리 디버거로 보니 점프부분에서 정상 또는 디버깅 당함을 출력하는 것을 결정한다.


그 위에는 IsDebugguerPresent 라는 함수를 호출한다


함수명만 봐도 디버거를 탐지하는 함수인지를 알 수 있다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10
CodeEngn Basic 03  (0) 2017.01.10
CodeEngn Basic 02  (0) 2017.01.10
CodeEngn Basic 01  (0) 2017.01.10


이 실행파일 역시 컴퓨터에 dll이 없어 실행할 수 없다고 나온다


그래서 pe뷰어로 pe구조를 보니 import directory table msvbvm50.dll이 있었다


컴퓨터에 dll이 없다고 했던 그 dll이.  그래서 dll 내 함수명들을 쭉 보니



이런 함수명이 있었다. vb는 비쥬얼베이직을 뜻하고 strcmp는 스트링 비교를 뜻하는거 같아 인증해보니 인증이 되었다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10
CodeEngn Basic 04  (0) 2017.01.10
CodeEngn Basic 02  (0) 2017.01.10
CodeEngn Basic 01  (0) 2017.01.10


먼저 다운받은 실행파일을 실행시켜 보았으나 실행파일이 손상되어 실행을 할 수 없었다.


그래서 pe뷰어로 실행파일의 pe구조를 보니



목록이 이렇게 밖에 나오지 않아 pe구조를 분석하지 못하는구나 라고 생각했다.



그래서 그냥 hex값들을 쭉 보다보니 실행파일이 손상되기전 파일을 실행시키면 쓰일 것 같은 문자열들이 보였다.


그중 비밀번호 같은 것을 인증해보니 인증되었다.

'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10
CodeEngn Basic 04  (0) 2017.01.10
CodeEngn Basic 03  (0) 2017.01.10
CodeEngn Basic 01  (0) 2017.01.10




GetDriveTypeA의 리턴값이 eax에 저장되는데 함수 종료후 eax는 두번 감소 된다


그리고 리턴값에서 -2 된 값과 esi를 비교해서 같을경우 CD-ROM으로 인식하는데 esi 3이므로 리턴값은 3이 되야 한다.


'문제 > CodeEngn_Basic' 카테고리의 다른 글

CodeEngn Basic 06  (0) 2017.01.10
CodeEngn Basic 05  (0) 2017.01.10
CodeEngn Basic 04  (0) 2017.01.10
CodeEngn Basic 03  (0) 2017.01.10
CodeEngn Basic 02  (0) 2017.01.10


문제 설명에  xss 봇이 서버에서 돌고있다고 설명해준다. 페이로드를 짜서 내 서버에 xss 봇의 정보를 전송하면 될듯하다.



문제 메인인데 내가 입력한것은 항상 봇이 확인한다고 한다.



기본적으로 alert부터 띄워보니 필터링은 하나도 없고 쿼터만 사용이 무력화된다. 


페이로드 짤때 쿼터 못쓰니까 짜증날거같아서 아예 스크립트를 만들기로 생각했다.



이런식으로 내 서버에있는 js파일을 삽입했다.



js파일은 간단하다. 내 서버로 xss 봇의 쿠키값을 전송한다.



 php 파일은 내 DB에 봇에서 날라온 쿠키를 저장하는 역할이다.


그러나 쿠키는 존재하지 않는가보다. 날라오는데 아무것도 보이지 않는다.



두번째로 생각한것은 그냥 봇의 소스이다. 봇 소스에 주석으로 FLAG 적혀있지 않을까 생각했다.



소스를 가져왔는데 내가 날린 스크립트만 있고 아무기능도 단서도 없다.



세번째로 생각한것은 봇의 URL이다. 내가 직접 들어가 보기로 했다.



그런데 그냥 파라미터 이름으로 flag가 박혀있었다.


재밌다.


'문제 > RingZeroTeam' 카테고리의 다른 글

RingZer0Team RingZer0 Authenticator  (0) 2016.09.06
RingZer0Team Windows API for the win!  (0) 2016.09.06


문제 이름에서도 알수있듯 이 파일은 PE32+  즉 윈도우 64비트 실행파일이다.


올리디버거 peviewer peid 등 대부분의 프로그램이 32비트 파일에 맞춰 나오므로 IDA를 통해 분석할 수 밖에 없었다.




먼저 실행을 시키면 숫자를 입력받는다.




소스를 보면 먼저 무한루프 아닌 무한루프를 도는데 6개의 랜덤값을 생성하고 입력값과 모두 일치하면 반복문을 빠져나간다.


v5는 1인 상태로 빠져나간다.


빠져나간뒤 하는 일을 보니 FLAG를 출력해주는 루틴같다.


루틴을 자세히보니 미리 선언해 놓은 값들을 연산해 플래그로 만드는 작업같다.


굳이 랜덤값 6개를 맞출 필요없이 위의 반복문만 빠져나가면 될거같다.


중요한건 밑에서 v5가 참일때 플래그를 출력해주는데 이부분도 반복문 빠져나가듯이 우회하면 될듯하다.


사실 플래그 출력해주는 부분은 선언해놓은 값들을 연산하는 부분이므로 간단한 코딩을 하면되긴 하는데 


나는 32비트 환경이라 64비트 환경에서 연산하면 값이 달라질거 같기도 해서 디버깅으로 풀기로 했다.


IDA로 디컴파일이 되니까 디버깅도 될거같았는데 IDA에서 쓰는 64비트 디버거를 어떻게 설정해주는지 모르겠어서 64비트 디버거를 찾아보기로했다.


구글링을 해보니 x64dbg라는 디버거를 찾았다.



먼저 cmp edx,6 부분을 우회해야 하는데 이부분은 반복문을 빠져나가는 부분이다.


rdx를 6으로 바꿔주면 빠져나간다.



test r8b,r8b 이부분은 위에서 v5가 참이냐 거짓이냐를 따지는 부분인데 r8 레지스터값을 1로 변경해주면 마찬가지로 우회가 된다.


두 부분을 우회하고 나니 플래그가 출력된다.




'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr ImagePrc  (0) 2017.01.23
Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr HateIntel  (0) 2016.10.05
Reversing.kr Music Player  (0) 2016.10.04
Reversing.kr Position  (0) 2016.09.30


실행파일과 readme를 준다. password를 찾으란다. 실행시켜보니 실행은 되지않고 무슨 파일인지 보니 mac os-x arm 환경에서 만들어진 파일이다.


현재 ARM 환경을 구축해놓은 서버가 없어서 일단 아이다로 보았다.



correct key! 라는 문자열이 있으니 따라가 보았다.



ARM 어셈블리어로 보여지는데 문법을 모른다.


그러나 IDA로 디어셈블링이 되기때문에 문제푸는데 문제는 없어보인다.



처음에 입력을 받고 sub_232c ()함수를 호출한 뒤 입력한값을 어떠한 배열과 비교한다.


당연히 sub_232c() 함수에서 입력한 문자열이 바뀔거라 생각하고 sub_232c() 함수를 분석했다.



sub_232c() 함수를 통해 연산이 끝나고 아래의 배열로 내가 입력한 문자열이 바뀌어야 한다.



반복문을 통해 각종 연산을 한다.



뭐 분석할 필요도 없이 코드도 짧고 연산도 간단해 brute forcing을 하면 될거라 생각했다.


입력값의 범위는 키보드로 입력할수 있는 아스키값들이다.


이 값들중 연산을 거쳐 위의 비교하는 배열과 맞으면 된다.



간단한 코딩을 통해 내가 입력해야 할 값이 나왔다. 비록 원본파일을 실행은 시키지 못하지만 인증하니 성공했다.





문제 이름부터 알수 있듯이 이 문제는 ARM 아키텍처를 이해하고 있는가에 대한 문제이다.


Intel 과 AT&T syntax에만 익숙해 있던 나에게는 공부없이 못풀 문제였지만  고급툴  IDA 통해 쉽게 풀었다.


안드로이드도 ARM 으로 구성되있기 때문에 시간될때  ARM 아키텍처에 대해 공부해야겠다는 필요성을 느꼈다.

'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr x64 Lotto  (0) 2016.10.06
Reversing.kr Music Player  (0) 2016.10.04
Reversing.kr Position  (0) 2016.09.30
Reversing.kr Direct3D FPS  (0) 2016.09.01


문제를 보면 음악 플레이어를 주는데 1분 이상은 못듣게 되있다. 1분이상을 듣도록 하면 플래그가 나온다고 한다.



일단 메시지 박스를 띄우길래 메시지 박스를 띄우는 곳으로 가보니 윗부분에 0xea60과 비교를 하는 부분이 보인다.


0xea60은 10진수로 60000이기 때문에 이부분이 1분을 limit 걸어놓는 부분이라는 것을 알 수 있다.


그러므로 cmp eax,0ea60h를 cmp eax,2ea60h로 패치했다.



실행 시켜보니 에러가난다.



이유가 뭘까하고 디버깅 하면서 삽질 하다가 밑줄친 함수에서 프로그램이 비정상종료된다.


test eax,eax 부분에서 eax가 0이면 함수를 실행시키지 않고 다른부분으로 점프되니까 eax를 0으로 맞춰주도록 프로그램을 패치했다.



최종적으로 총 2부분, 60000을 충분히 키워주고 sub eax,eax로 eax를 0으로 맞춰주도록 패치했다.



실행해보니 1분이상 음악듣기가 가능해졌고 프로그램 타이틀에 플래그가 뜬다.


1분이상 못듣는 음악 플레이어를 크랙한것이다.


확실히 비쥬얼 베이직으로 만들어져서 한번도 코딩해보지 않은 언어라 분석하기도 좀더 껄끄럽고 짜증났다.



'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr x64 Lotto  (0) 2016.10.06
Reversing.kr HateIntel  (0) 2016.10.05
Reversing.kr Position  (0) 2016.09.30
Reversing.kr Direct3D FPS  (0) 2016.09.01


readme.txt를 읽어보면 시리얼값이 76876-77776일때의 password를 구하라고 한다. 그리고 password의 마지막 값은 'p'이다.



실행해보니 Wrong이라고 나와서 Wrong을 출력해주는 부분을 찾아가 보았다. 시리얼값의 포맷은 xxxxx-xxxxx이다.




sub_401740 함수의 리턴값이 1이면 Correct를 띄워줘서 sub_401740 함수를 분석해 보았다.




제일 처음에 필터링 하는 부분은 password값이다. 4글자여야 하고 알파벳 소문자여야 한다.


그리고 본격적으로 password값을 연산해  시리얼값을 만들어낸다.


먼저 생소한 함수를 찾아보았다.


GetAt(char* a1, int a2) : 문자열 a1의 a2번째 인덱스의 값을 반환해 준다.

 

먼저 if문으로 값을 검증하는 루틴 10개가 있다. 시리얼 값도 '-'를 제외하면 10자리 이므로 이부분에서 시리얼 값을 만들고 비교한다는것을 알았다.


v61은 password이므로 한자리씩 갖고와서 shift연산, and연산등을 통해서 내가 입력한 시리얼 값과 비교를 한다.


예를들어 if(v13==v12) 이부분은 v12는 내가 입력한 시리얼값의 첫번째 인덱스, v13은 password를 연산해 나온 시리얼 값의 첫번째 인덱스이다.


이런식으로 10자리가 전부 맞아야 1을 반환해준다.


password : xxxx

serial :xxxxx-xxxxx


크게보면 password값 1,2,번째 값을 통해 시리얼값 '-' 앞부분 5자리를 만들어내고 password값 4,5번째 값을 통해 시리얼값 '-' 뒷부분 5자리를 만들어 낸다.


연산하는 부분을 참고해 코드를 짜보았다.






어떤 사람이 bruteforce 해주는 툴을 만들었다.


아직 핸들, 윈도우메시지등 win32 api는 생소하니 좀더 공부해본후 내가 직접 만들어야 할거같다.



#include <iostream>
#include <Windows.h>
using namespace std;
void bruteForce(HWND hwndName, HWND hwndOutput)
{
   wchar_t inputName[5] = L"xxxp";
   wchar_t output[10];
   cout << "Correct Names:" << endl;
   for (int i = 0x61; i < 0x7B; i++)
      for (int j = 0x61; j < 0x7B; j++)
         for (int k = 0x61; k < 0x7B; k++)
         {
            inputName[0] = i;
            inputName[1] = j;
            inputName[2] = k;
            SendMessage(hwndName, WM_SETTEXT, 0, (LPARAM)inputName);
            SendMessage(hwndOutput, WM_GETTEXT, 10, (LPARAM)output);
            if ((char)output[0] != 'W')
               wcout << inputName << endl;
         }
}
int main() {
   cout << "##############################################"<< endl << endl;
   cout << "[Reversing.kr] Position Bruteforcer" << endl;
   cout << "by 거북찡 http://blog.naver.com/7005ye" << endl << endl;
   cout << "##############################################" << endl << endl;
   HWND hwnd;
   wchar_t serial[12] = L"76876-77776";
   if ((hwnd = FindWindow(NULL, L"Position")) != NULL)
   {
      HWND hwndName = FindWindowEx(hwnd, NULL, L"EDIT", NULL);
      HWND hwndSerial = FindWindowEx(hwnd, hwndName, L"EDIT", NULL);
      HWND hwndOutput = FindWindowEx(hwnd, NULL, L"STATIC", NULL);
      SendMessage(hwndSerial, WM_SETTEXT, 0, (LPARAM)serial);
      cout << "Bruteforcing for serial# "; wcout << serial << endl;
      bruteForce(hwndName, hwndOutput);
   }
   else
      cout << "Position 캡션 감지 실패. 프로그램을 종료합니다" << endl;
   system("PAUSE");
   return 0;
}

출처 : http://blog.naver.com/7005ye/220690081917


'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr x64 Lotto  (0) 2016.10.06
Reversing.kr HateIntel  (0) 2016.10.05
Reversing.kr Music Player  (0) 2016.10.04
Reversing.kr Direct3D FPS  (0) 2016.09.01

+ Recent posts