defcon2019 veryandroidoso
by St1tchapk문제인데, 처음 문제를 보자마자 후킹으로 풀면 편할 것 같다는 생각을 했다.
문제는 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함수를 바로 호출해서 빠르게 플래그를 얻을 수 있었다..
이 문제는 후킹없이도 충분히 풀 수 있는 문제이지만, 분석을 조금 덜 하고 그냥 필요한 값들이나 함수를 후킹을 통해 얻은 후, 필요한 부분만 구현하여 플래그를 얻을 수 있는 그런 문제였다.
(아래는 후킹없이 구현해서 푼 코드. ㅇㅅㅇ)
블로그의 정보
튜기's blogg(st1tch)
St1tch