상세 컨텐츠

본문 제목

[xcz.kr #19] Revershit! - 300 points

Reversing/xcz.kr

by bing_su 2021. 1. 13. 21:38

본문

반응형
SMALL

xcz.kr의 Reversing 문제를 풀어 봤다. 300 points며 19번째 문제이다.

 

일단 실행 파일을 디버거로 분석했다. 

함수가 호출되는데 이 함수가 실행되면 아래와 같은 선택지가 나온다.

숫자나 E를 입력하면 각 항목에 대한 세팅을 할 수 있다. 일단 ADD 항목을 실행해 이름, 나이, 성별, 타입을 임의로 입력하자. 입력 후에는 내가 입력한 값이 들어있는 log.txt 파일이 아래와 같이 생성된다.

아마 입력 값에 따라 플래그가 출력되는 것 같다.

문자열 참조를 해 본 결과 역시 key 값을 출력하는 부분이 있음을 확인할 수 있었다.

IDA에서 역시 이 부분을 찾을 수 있었고, 이 부분에 대해 key 값이 어떻게 생성되는지 확인해 봤다.

key 값을 생성하는 과정에서 XOR, + 연산을 하는 것을 볼 수 있고, 이제 여기서 알아야 할 부분은 (a1+4), (a1+28), (a1+29)의 값이 무엇인지 알면 된다. 따라서 다시 동적 분석을 통해 각 값이 무엇을 의미하는지 알아보자.

main에 대한 부분이다. 우리가 입력한 값에 대한 정보가 들어있는 log.txt 파일을 읽어오는 부분이 보인다. 읽어오는 이 과정에서 malloc 함수가 호출된다. 

덤프 부분은 malloc 함수 호출 뒤 반환되는 주소인 0x009731E8을 따라간 것이다. 우리가 입력한 이름값인 "bingsu" 문자열이 보인다. 또한, W, A의 값도 보인다. 

 

IDA에서 봤던 a1 인자가 malloc 함수가 리턴되고 그 주소에 있는 값이라고 하면, [a1+4]는 우리가 입력한 사용자의 이름(bingsu), [a1+28] 부분은 성별(W), [a1+29] 부분은 Type(A) 값이 들어가 있다는 것을 확인할 수 있다.

 

또한, 해당 부분에서 [EAX+1D]에 해당하는 부분은 리턴 값에서 0x1D(29)만큼 떨어진 내가 입력한 Type인 'A'가 들어있음을 다시 한번 확인할 수 있었다.

아까 봤던 key를 생성하는 부분이다. if 문이 실행되어야 key 값을 얻을 수 있기 때문에, 사용자의 이름인 [ a1 + 4 ]에 해당하는 값은 'E'가 되어야 한다는 것을 알 수 있다.

이 문제의 설명 부분이다. 이 부분에서 나머지 값도 추측해 볼 수 있다. "She"를 굳이 쓴 것에서 성별인 [a1+28] 부분은 W, 첫 문장의 주어를 "She"가 아닌 'B'로 시작했다는 점에서 Type에 해당하는 [a1+29]는 B임을 알 수 있다.

 

따라서 사용자의 이름, 성별, Type에 대한 정보를 파악한 후 key 값을 생성하는 로직에 맞게 코드를 짜 주도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
void main() {
    int a[12= { 95-747285-8068-947165-82-69-75 };
    char s[4= "WEB";
    char str;
    
    for(int i = 0; i < 12; i += 3)
        for(int j = 0; j < 3; j++) {
            str = a[i + j] ^ s[j];
            str += 80;
            printf("%c ", str);
        }
}
 
 

이 코드를 실행하면 flag에 해당하는 값이 출력된다. Hint1의 문장과 같이 ASCII 문자열로만 된 값이 플래그 값이다.

 

ASCII 문자열로만 된 플래그 값이기 때문에 이름을 제외하고, 성별과 Type에 대한 부분을 Brute Force 과정을 통해 유추할 수도 있다는 생각을 했다. 하지만 문제에서 주어지는 상황 역시 잘 해석하면 Brute Forcing을 굳이 하지 않아도 문제를 풀 수 있다는 것을 생각하게 해 주는 문제였다.

반응형
LIST

댓글 영역