일어나서 첫 번째로 푼 문제이다. 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[] = { 0x50, 0x43, 0x8A, 0x64, 0xED, 0xA6, 0xAB, 0x93, 0xCC, 0xEB, 0xC2, 0x9A, 0xFA, 0x6A, 0xAB, 0x93, 0xCC, 0xEB, 0x6A, 0xBB, 0x62, 0x33, 0xD1, 0xF5, 0xC2, 0x9A, 0xFA, 0x6A, 0xBB, 0x62, 0x33, 0xD1, 0xD7 }; 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 |