본문 바로가기

Write Up

HackIM 2016 Reversing - Pesudorandom


이번에는 300점짜리 두 번째 문제입니다. 역시 64비트고 IDA로 먼저 뜯어보면 

rand값으로 sleep을 하고 함수 내에서 막 연산한 값을 가지고 오고 난 뒤에 값을 입력받습니다. 입력받은 값을 다시 sub_400ea0함수에서 체크하고 md5해시를 구하며 막 반복문을 진행하다가 특정 값이 되면 빠져 나오고 해시를 비교한 뒤에 flag를 출력해 줍니다. 체크 함수를 보면 

복잡해 보이지만 어차피 올바른 입력값은 하나 이므로 저 함수를 그대로 가져와서 브루트포싱을 해 주면 입력해야 하는 값을 구할 수 있습니다. 디버깅을 통해 sub_400ea0함수에 함께 넣어주는 값들만 찾아서 브루트포싱 해 주면 됩니다.

이런 식으로 소스를 짜서 값들을 모두 구해 내면 됩니다. 앞의 몇몇 값을 구하다 보면 규칙성이 있는 것을 파악할 수 있고 그 뒤는 굳이 소스를 돌려보지 않아도 값을 알 수 있게 됩니다. 이렇게 해서 최종적으로 알아낸 값들은

32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 256 512 1024 2048 4096 8192 16384 32768 65536 128 256 512 1024 2048 4096 8192 16384 32768 64 128 256 512 1024 2048 4096 32 64 128 256 16 32 64 128 8 16 32 64 4 8 16 32 2 1

이렇게 되며 이 값을 모두 sleep함수가 nop으로 패치된 바이너리에 넣고 돌려주면 플래그를 얻을 수 있습니다.



Key : nullcon{50_5tup1d_ch4113ng3_f0r_e1i73er_71k3-y0u}