본문 바로가기

My Study/Crack Me

Defcon 2010 예선 바이너리 1번

어찌어찌 하다가 풀게된?? ㅠㅠ
문제를 봐보니 다른 해킹대회에서 많이 쓰이는 패턴을 사용한 문제였습니다.
일단 풀어보겠습니다.
=================================================
먼저 실행을 시켜보겠습니다.

파일 명 뒤에 아무런 인자를 주지 않고 실행시켜보니 " Please supply a key " 라는 문자열을 출력하고 종료됩니다.
반면 인자를 하나 주고나서 실행시켜보면 " I hope you get it! Gooc luck " 라는 문자열과 아래는 무슨 외계어가 출력이 됩니다. 먼저 저 문자열이 어디서 사용되고 있는지를 보기위해 IDA에서 찾아가보았습니다.
간단히 보기위해 Hex-ray를 사용해 보도록 하겠습니다.

코드를 보기 인자를 하나 받아되군요. 여기 부분이 메인함수 인거 같습니다.
아무튼 인자 입력했다는 전제하에 쭉 봐보니 0x8048698, 0x804886A 두 함수에서 어떠한 일을 하고 있더군요.

0x8048698 함수
자세한 분석을 위해 Hex-ray가 아닌 어셈 코드로 보시겠습니다.
0x8048987함수를 호출하면서
첫번째 인자 : char* buf
두번째 인자 : argv[1]
세번째 인자 : strlen(argv[1])
이렇게 전달하고 있습니다.

함수 내부를 들어가 보겠습니다.

딱봐도 첫번째 인자로 전달된 buf 배열에 값을 셋팅하고 있습니다.
뭐 입력받은 수를 더하고 나머지 구하고 지지고 볶고 하고 있습니다. 어떠한 값이 셋팅이 되겠지요.
일단은 무턱대고 이러한 루틴을 전부 분석할 필요는 없으니 대충 이러한 일을 하는 함수구나.. 라는 것만 가지고 넘어가도록 하겠습니다.

다음 함수를 보겠습니다.
0x804886A 함수
첫번째 인자 : buf
두번째 인자 : " 이상한 문자열 "
세번째 인자 : 34
일단 내부로 들어가보겠습니다.

어떠한 값을 만들어 내는 함수인거 같습니다. 딱 보니 두번째 인자로 전달된 문자열을 셋팅해주는거 같습니다.
0x80487AA 함수의 결과와 XOR연산을 해서 값을 구하고 있습니다. 0x80487AA함수의 인자로는 buf가 들어갔군요.
이 루틴또한 특정 값을 생성시키는 함수인거 같군요. 이상한 알고리즘 같으니 분석은 일단 놔두고 넘어가겠습니다.

그러고 이 함수는 종료가 되는데요. 쭉 정리해보면 입력받은 문자열을 지지고 볶고 해서 외계어 같은 문자열이 출력이 됩니다.
여기서 키를 찾으라는데 이상하군요. 일단 더 많은 정보가 없나 사용되는 문자열을 봐보던 중 이상한 부분이 걸렸습니다.


%s 서식문자가 있다는 것은 문자를 출력한다는 것입니다. 하지만 두개의 %s가 있는 걸로봐서 다른 루틴이 존재하나 봅니다.
찾아본 결과 다른 루틴이 존재했습니다.

루틴을 봐보면 가장 위의 for문에서 두 값을 비교해서 같을 경우 아래의 루틴으로 들어오도록 되어있습니다.
v3,4,5,6,7,8 부분이 수상하여 문자열로 봐본 결과
" securekey "라는 문자열이었습니다.
그 아래로 0x8048698, 0x804886A 함수가 호출되고 있는데 위에서 봤던 함수와 같습니다.
" securekey "라는 문자열을 가지고 지지고 볶고 하나봅니다. 왠지 securekey를 치면 답이 나올꺼 같아서 해봤지만.. -.-;;
허탕쳤습니다.

일단은 포기하지말고 거의다 접근한거 같으니 좀더 위 루틴을 자세히 분석해보겠습니다.
아마 분석해보시면 아시겠지만
위 for문에서 두 문자열을 비교하고 있는데 하나의 문자열에는 제가 입력한 값을 가지고 셋팅한 문자열이 들어있었고
다른 하나의 문자열에는 그냥 전역변수인거 같은데 이상한 외계어 값이 있었습니다.

두 문자열이 같을 확율은 .. 거의 2번 이월된 로또 1등에 혼자 당첨될 확율인거 같군요.
그래서 문자열을 입력해서 아래 루틴으로 내려간다는 것은 불가능이니 
코드 수정을 시켜서 넘어가보도록 하겠습니다.

여기서 코드수정해서 갈수있는 방법이 두가지가 있는데 전 아래와 같은 방법을 사용했습니다.

ebp-0xd 에 1을 넣고 있고 그 아래서 for문을 돌면서 두 문자열이 다를 경우 0을 넣고 있습니다.
그 0과 ebp-0xd값을 비교해서 같으면 점프를 해버리게됩니다. ( 점프를 안해야함 )
그러면 비교하는 부분에서 0x0의 부분을 0x1로 바꿔버리게 되면 이 루틴은 무조건 점프를 안하게 되어있습니다.
일단 해당 코드를 수정하도록 하겠습니다.

저 부분을 01로 수정시켜 줍니다.
수정시켜 주고 다시 파일을 실행시켜보겠습니다.

제대로 키를 찾았습니다.  에구;;ㅠㅠ

키는 찾았고 마지막으로 루틴 조금만더 보겠습니다. 방금 위 루틴을 호출한 함수를 가보면

__cxa_atexit 함수를 사용하면서 프로그램이 종료될 때 0x80488E0함수가 실행되도록 해 놓았습니다.
( 찾아보니 그런 함수래요.. )

항상 문제를 풀면서 느낀거지만 출제자의 의도를 파악하는게 정말 중요한거 같습니다.

'My Study > Crack Me' 카테고리의 다른 글

Defcon 2010 예선 바이너리 3번  (0) 2010.06.02
Defcon 2010 예선 바이너리 2번  (0) 2010.06.02
HellBound Application Cracking 15  (0) 2010.04.29
HellBound Application Cracking 2  (2) 2010.04.28
PADOCON 2010 CatchMe 문제 풀이  (0) 2010.02.09