이번에는 500점 짜리 문제입니다. 500점 짜리인 만큼 난이도가 꽤 있었습니다. 역시 64비트 바이너리인데 IDA로 열자마자 입에서 욕이 나왔었습니다... 열어보면
IDA의 그래프 개형이 이렇게 생겼기 때문입니다. 처음에는 열고 나서 다시 닫았습니다. 생긴 것이 꼭 핀툴을 써서 해야 할 것처럼 생겨서 이 문제는 접어야 겠다 하고 닫았었는데 시간이 좀 지나고 다시 분석해보자 하고 열어서 좀 보니까 뭔가 될 것도 같아서 분석을 시작했습니다. 일단 헥스레이로 보면
엄청난 양의 반복문이 중첩으로 존재합니다. 프로그램을 난독화 시켜 놓은 것인지는 모르겠는데 v37을 기준으로 그 값에 어떠한 값이 들어 있냐에 따라 프로그램 흐름이 달라지는 방식입니다. 그래서 분석을 해 보면 먼저
이 부분에서 입력을 받는데 반복문을 돌면서 총 16번 입력을 받습니다. 그 값을 v64배열에 저장하고 dest에 모두 이어 붙입니다. 다 입력을 받으면
이러한 부분이 다시 16개가 있는데 각 배열 원소 하나마다 각각 sub_400780함수를 호출할 때 함께 인자로 넣어주는 값이 다릅니다. 저기서 저 함수의 리턴값이 0이 아니라면 실패 부분으로 분기하게 됩니다. 즉, 우리는 0이 나오는 값을 찾아야 하는데 저 함수 내용 역시
이렇게 되어 있고 & 연산이 주를 이루기에 역시 역연산을 하기에는 무리가 있어 보입니다. 즉, 저 함수를 다시 가져와서 브루트포싱을 해 주면 해결할 수 있게 됩니다.
이런 식으로 해당되는 값들을 구해주면 됩니다. 여기까지는 이전 문제와 비슷합니다. 그런데 중요한 것은 여기서 위에 해당하는 값들이 하나가 아니라는 것입니다. 16개의 값들 모두 찾아본 결과
4, 45, 72 - 0 (11)
8 - 1 (12)
31, 51 - 2 (6)
8 - 3 (7)
2, 29 - 4 (4)
10, 24 - 5 (13)
0, 41, 42 - 6 (5)
3, 27 - 7 (0)
10, 54, 60 - 8 (1)
42, 73 - 9 (15)
31 - 10 (8)
20, 28, 92 - 11 (14)
19, 90 - 12 (10)
19, 32, 96 - 13 (2)
20, 93 - 14 (9)
2, 31 - 15 (3)
이렇게 각각 1개에서 3개 정도의 값이 있습니다. (()안의 값은 함께 인자로 전달되는 값입니다.) 여기서 16개의 값들이 모두 연산한 결과가 0이 나온다면 다음으로 넘어가는데
16개의 값을 이용하여 이러한 연산을 거쳐 v39에 값을 세팅합니다. 이 값은 0이 아니어야 하며 0이 아니라면 다음 연산으로 넘어갑니다.
이 다음에는 이러한 부분이 있는데 이 부분은 각 배열의 원소가 홀수인지 짝수인지 판별하는 부분입니다. 짝수라면 다음 배열 원소로 넘어가고 홀수라면
그 원소 값을 이용해 다시 v38을 연산합니다. 이렇게 16번 루프를 다 돌고 나면
v39와 v38을 이용해서 다시 v39를 세팅하고 그 값을 3과 비교합니다. 그 후에 3이 아니라면 4와 비교하는데 사실상 이 부분에서 v39가 3이 되는 경우는 없으므로 단순히 4와 비교하는 것이라고 봐도 무방합니다. 만약 4가 아니라면 실패 부분으로 분기하고 4라면
v38을 3과 비교하며 같지 않다면 실패하게 됩니다. 이 모든게 맞아 떨어지게 되면 성공 부분으로 분기하며 플래그를 출력해 줍니다. 위에서 구한 값들을 이용하여 맞는 값들을 찾아보면 성공 부분으로 분기하는 값들은 총 9개가 나오며 그 중 하나만이 정상적인 flag를 뱉어줍니다. 소스는 이 때 당시에는 밤을 새고 이 문제를 푼 거라서 정신이 오락가락 할 때 짠 소스라 많이 더럽고 좀 더 효율적인 방법을 생각하기가 힘들어서 16중 for문을 이용해 풀었기 때문에 소스는 올리지 않고 결과값만 올리겠습니다.
9개의 값이 존재하며 이 중 두 번째 값으로 넣었을 때 정상적인 플래그가 나왔었습니다.
Key : nullcon{d0n_f05ing_15_4rt_t0_l34rn}
'Write Up' 카테고리의 다른 글
2016 Sharif CTF Write-Ups (0) | 2016.02.07 |
---|---|
HackIM 2016 Reversing - PrisonBreak (1) | 2016.02.01 |
HackIM 2016 Reversing - Pesudorandom (0) | 2016.02.01 |
HackIM 2016 Reversing - ZorroPub (0) | 2016.02.01 |
[2016 CAT HolyShield] Reversing - Who Am I? (5) | 2016.01.23 |