본문 바로가기

Write Up

PlaidCTF 2016 quick - 175pt


일어나서 첫 번째로 푼 문제이다. IDA로 까 보면 

스위프트로 짜여 있어서 좀 더럽다. 그래도 몇 번 보다 보니까 익숙해져서 풀 수 있었다. 디버깅 하면서 보니까 먼저 값을 입력받고, sub_403660함수에서 연산을 한다. 

이렇게 테이블이 있고, 연산을 해서 저 테이블이랑 비교를 하는 부분이 두 군데가 있다. 그런데 첫 번째 부분은 입력값이 쓰이지 않는 연산이라서 그냥 패치를 해서 넘겼고, 두 번째 연산에서 입력값이 쓰여서 이 부분만 분석했다. 

먼저 연산은 sub_403510 이 함수에 있는 것이 전부라고 해도 과언이 아니었다. 

보기가 좀 거슬리기 때문에 중요 부분만 뽑아서 다시 짜봤다. 

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(void) {
    unsigned char table[34], prev_char = 0;
    char input[] = "PCTF{abcdefghijklmnopqrstuvwxyz0}";
    for (int i = 0; i < sizeof(input); i++) {
        table[i] = ((input[i] << (8 - (prev_char & 7))) | (input[i] >> (prev_char & 7))) & 0xff;
        prev_char = table[i];
        printf("0x%x, ", table[i]);
    }
}
cs

그리고 주어진 테이블을 이용해서 브루트포싱 소스를 짰다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main(void) {
    unsigned char table[] = { 0x500x430x8A0x640xED0xA60xAB0x930xCC
        0xEB0xC20x9A0xFA0x6A0xAB0x930xCC0xEB0x6A0xBB0x62,
        0x330xD10xF50xC20x9A0xFA0x6A0xBB0x620x330xD10xD7 };
    int prev_char = 0, cha = 0;
    for (int i = 0; i < 33; i++) {
        for (int j = 0; j < 0x100; j++) {
            cha = ((j << (8 - (prev_char & 7))) | (j >> (prev_char & 7))) & 0xff;
            if (cha == table[i]) {
                printf("%c", j);
                prev_char = j;
                break;
            }
        }
    }
}
cs

실행하면 플래그가 나온다.


flag : PCTF{5ur3_a5_5ur3_5w1ft_a5_5w1ft}

'Write Up' 카테고리의 다른 글

2015 Christmas CTF vsnoted  (0) 2016.04.30
PlaidCTF 2016 quite quixotic quest - 300pt  (0) 2016.04.18
2016 CodeGate watermelon exploit  (1) 2016.04.01
2016 CodeGate bugbug exploit  (1) 2016.04.01
2016 CodeGate fl0ppy exploit  (1) 2016.04.01