CTF | wargame

xcz.kr / Revershit! (숨겨진 메뉴 찾기)

nopdata 2017. 3. 27. 12:27



프로그램의 흐름은 위와 같다. 메인 메뉴가 있고, 데이터를 삽입하거나 조회하거나 지우는 등의 기능을 한다. 데이터는 log.txt로 저장이 된다.
key를 어디선가 찾아야 한다면 보통 메뉴가 아닌 숨겨진 메뉴에 있을 가능성이 크므로, 먼저 string 조회를 해 보았더니 key메시지가 출력되는 함수를 찾을 수 있었다.


04123E0함수의 일부이다. Key로 무언가 출력이 되는데 그 이전에 어떠한 연산을 진행한다. 04123E0 함수는 2번 옵션인 List 기능 수행시 동작이 된다.

ollydbg로 동적 디버깅을 하며 위 부분을 찾아가 보았더니 각각 a1+4는 입력한 이름, a1+28은 성별, a1+29는 클래스에 해당하며, 나이는 중요하지 않다.
제일 처음 조건으로 a1+4 == 'E'가 되어야 하기 때문에 이름은 E가 되어야 한다. 그리고 지문을 보면 힌트가 되는 B는 she라고 지칭되어 있는 것을 미루어 성별을 'W'로 해주어야 함을 알 수 있다. 나머지 클래스 값의 경우 명확한 단서가 없기 때문에 소스코드를 작성하여 맞춰보는 방식으로 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
table = ['A','B','C','D','E','F']
for ch in table:
    data = [0x5f,0xb6,0x48,0x55,0xb0,0x44,0xa2,0x47,0x41,0xae,0xbb,0xb5]
    print ch
    for i in range(0,12,3):
        data[i] = ((data[i] ^ ord('W'))+80& 255
        data[i+1= ((data[i+1] ^ ord('E'))+80& 255
        data[i+2= ((data[i+2] ^ ord(ch))+80& 255
    for ch in data:
        try:
            print chr(ch),
        except:
            pass
    print ''
 
A
X C Y R E U E R P I N D
B
X C Z R E V E R S I N G
C
X C [ R E W E R R I N F
D
X C \ R E P E R U I N A
E
X C ] R E Q E R T I N @
F
X C ^ R E R E R W I N C
>>>
성적이 B 였을 때 나오는 문장이 가장 답과 근접함을 알 수 있어 이름은 'E', 성별은 'W', 성적은 'B'를 넣어주면 답을 얻을 수 있다.

flag : XCZREVERSING