본문 바로가기

CTF

[CODEAGATE 2017] Junior write up

codegate 2017 Junior write up (Mic Check, RamG-thunder)

Mic Check - 50p




2월 10일날 열렸던 CODEGATE 2017 예선전에서 총 2문제를 풀었습니다.

그중 RamG라는 이름을 가진 리버싱 문제는 대회당시 실력이 부족하기도 했고 시간이 많이 없었던 관계로 대회가 끝나고 풀게되어서 본선을 못가 아쉬움이 많았던 대회였습니다.



문제는 이렇게 생겼습니다. 

IDA나 ollydbg 로 문제를 살펴보면 기본메뉴안에 4번을 입력할시 hidden menu 가 나오는 것을 바로 확인할 수 있었습니다.



제가 중요하게 봤었던 부분은 stage1과 stage5의 key를 입력받는 두 부분입니다.


sub_405C20 함수속으로 들어가 보면 



00BFF464 주소에 들어있는 문자열 "MVYLXYUARJ"과 입력했던 값들을 비교합니다. 

위 코드에서 정상적인 key 값을 넣었다면 if문으로 아니라면 else문으로 빠지는거 같네요.

그렇다면 입력한값 xor 4745947459 == MVYLXYUARJ 가 나와야 성공입니다.


이방법과 똑같이 stage 5에 있는 부분에가면 입력한값 xor 3674231096 == [S[X]DWYJ^ 가 나와야 성공입니다.

그렇다면 key 값을 찾아야 함으로 반대로 xor 역연산을 해주었습니다.

stage1 의 특정한 문자열 "MVYLXYUARJ" 과 47459 xor연산 

stage5의 특정한 문자열 "[S[X]DWYJ^" 과 3674231096 xor 연산


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
    char a[] = "MVYLXYUARJ";
    char a1[] = "4745947459";
    char b[] = "[S[X]DWYJ^";
    char b1[] = "3674231096";
 
    for (int i = 0; i < 10; i++)
        printf("%c", a[i] ^ a1[i]);
    printf("\n");
 
    for (int i = 0; i < 10; i++)
        printf("%c", b[i] ^ b1[i]);
    printf("\n");
    return 0;
}
cs



stage 1의 key 는 "yamyambugs"

stage 5의 key 는 "hellowfish"



stage 1의 안티디버깅 루틴입니다. NOP 처리 해주고 넘어갔습니다.




그다음 stage 2의 모습입니다. 

저는 저 stage2 연산들이 무슨 의미인줄 모르기 때문에 대충 흐름을 볼때 if문으로 가야할 것 같았습니다.

address[0] = -56  address[1] = 89  address[2] = 120

위 부분들을 따로 dump 뜬 다음 위 값들로 바꿔주어 if 문으로 가주게 해주었습니다.



그다음 stage 3의 모습입니다.

사실 이부분에서 약간 해맸는데 이부분에선 if문이 아닌 else 문으로 가주어야 합니다.

else 문으로 가주었다면 또 if문과 else 문이 있는데 hel 이 있는 부분으로 가주었습니다

즉 stage 3에서는 else -> else 문으로 가주게 조작을 해주어야 합니다.



stage 4 의 모습입니다. 

이부분에서의 주의할점은 stage 2와 같이

Address[0] = 0  Address[1] = 12  Address[2] = 41

위 부분들을 dump 뜬후에 값들을 위와 같이 변경 한 후 if문으로 가주게 해주고

밑에 보이는 안티디버깅을 체크하는 함수들은 간단히 우회해주시면 됩니다.




마지막 stage 5의 모습입니다.

맨 위에서 stage 5의 key 값인 "hellowfish" 넣어주었습니다.

그다음 밑부분에 있는 do-while 문을 보면 이제까지 연산한 값들과 1505여번의 연산을 통해 c라는 이름을 가진 파일의 data값들을 만들고있습니다.



이제까지 했었던 우회를 통해 값들을 넣어준다음 바탕화면을 확인해보니 c라는 이름을 가진 파일이 생성되었습니다.

hxd로 열어보면



png 파일인것을 확인할 수 있었습니다.

그럼 약 1505 번의 반복문은 이 png 파일의 데이터 값들을 만들기 위한 루틴이였다는 것을 확인할 수 있었습니다.



FLAG 사진이 뜬것을 정상적으로 확인할 수 있었습니다.


사실 이 문제에서는 stage 마다 각각의 연산을 해주는 함수 부분들이 있는데 함수들의 연산이 어떤 의미를 가지고 있는지 파악하지 못한

채 억지로 if 문으로 가주게 조작하여 거의 야매식? 으로 문제를 풀게되었습니다


문제를 풀면서 아직 실력이 부족하다는 것을 뼈저리게 느끼며 이후 공부를 더 열심히해 다시한번 이문제를 풀어봐야겠습니다.


'CTF' 카테고리의 다른 글

제 12회 정보보호올림피아드 예선풀이  (2) 2017.10.30
ASIS CTF Final 2017 Write up (ABC Reversing challenge)  (0) 2017.09.19
YISF 2017 본선 풀이(x)  (0) 2017.09.18
YISF 2017 write up  (0) 2017.08.09
DIMICTF 2017 write up  (0) 2017.07.16