defcon2019 veryandroidoso

Reversing/리버싱 문제풀이

2019.05.15 12:48

apk문제인데, 처음 문제를 보자마자 후킹으로 풀면 편할 것 같다는 생각을 했다.

문제는 18글자의 플래그를 맞추면 끝나는 문제인데, 검사를 할 때는 2 글자씩 hex로 바꿔서 검증을 하기 때문에, 총 9번의 검증 루틴을 통과하면 플래그를 얻을 수 있다.

사실상 8번째 까지는 후킹으로 빠르게 값을 뽑아낼 수 있다.

마지막 한글자가 8번째까지의 입력한 값들에 따라 바뀌기 때문에, 이에 대한 처리만 잘해주면 된다.

우선, 필요한 함수들은 frida에서 바로바로 호출해서 쓸 수 있으니, 필요한 데이터들을 먼저 골라냈다.

 

1. 입력값에 대한 dictionary 정보 및 getSecretNumber 정보 추출.

- 각 조건에 맞는 글자들의 경우의수가 1가지가 아니기 때문에, 쉽게 풀기 위해서는 입력값과 검증 함수에 들어가는 값의 사전 정보가 필요하다.

- 브루트포싱시 getSecretNumer를 계속 호출하면, 속도가 느려지기 때문에, 어차피 고정된 값이니 미리 추출해서 사용하면 빠르다.

 

 

2. flag의 8번째 글자까지의 모든 경우 알아내기.

- 후킹을 fail함수에 걸고, 각 스테이지의 함수들을 호출하였다.

- 각 스테이지에서 만족하는 값들을 모두 출력을 하였고, 다음 단계에서 이를 이용해 마지막 한 바이트를 찾아야 한다.

 

3. 브루트 포싱 ~ 

- 3,4,5,6번째 글자의 경우의 수가 각각 2,2,16,64 이므로 총 4096의 경우의 수가 있다.

4096번에 각각의 경우에 수에 맞는 마지막 바이트를 찾고, 완성된 값이 마지막 검증에서 통과하는지를 알아내야 한다.

 

solve함수를 호출하여 하나하나 확인을 하면 너무 오래걸린다. 뭐 sleep함수에 후킹을 걸어 시간을 줄일 수는 있다.

나는 마지막 검증에 사용하는 m8, m9함수를 바로 호출해서 빠르게 플래그를 얻을 수 있었다..

 

 

 

이 문제는 후킹없이도 충분히 풀 수 있는 문제이지만, 분석을 조금 덜 하고 그냥  필요한 값들이나 함수를 후킹을 통해 얻은 후, 필요한 부분만 구현하여 플래그를 얻을 수 있는 그런 문제였다.

 

 

(아래는 후킹없이 구현해서 푼 코드. ㅇㅅㅇ)