HackToday 2018 Final - Reversing

back2basic

Write-up singkat salah satu challenge yang saya persiapkan untuk babak final HackToday 2018 - back2basic (100 pts).

Description

Someone using a familiar sequence for his personal program, but it’s kinda different. Let’s find out.

Solution

Fungsi hahaha hanya mengubah nilai variabel v, yang mempengaruhi nilai x pada akhir program. Jika dipahami lebih dalam, fungsi hahaha mengubah nilai variabel v dengan pola deret biner negatif (-1, -2, 4, 8, -16, -32, ...).

>>> (- 1 - 2 + 4 + 8 - 16 - 32 + 64 + 128 - 256 - 512 + 1024 + 2048 - 4096 - 8192 + 16384 + 32768 - 65536 - 131072 + 262144) - 170385
>>> -65528

Sehingga untuk mencapai nilai x = 170385, kita harus mengurangi nilai x sebesar 65528 agar lolos pada pengecekan terakhir. Ingat bahwa -65528 = -65536+8, maka kita susun input yang dimasukkan sedemikian rupa agar tidak dieksekusi kedalam kondisi tersebut. Berikut kodenya.

Implementation

from z3 import *

s = Solver()
arr = [BitVec(i, 32) for i in range(28)]

for i in range(28):
 s.add(arr[i] >= 0x20)
 s.add(arr[i] <= 0x7f)

addu = [1052, 787, 201, 666, 956, 1078, 681, 901, 1100]
mulu = [1898, 2228, 681, 634, 337, 356, 273, 246, 2079]
xumu = [69, 29, 126, 61, 9, 24, 64]
rr1 = [5, 3, 3, 5, 3, 3, 5, 2, 3]
rr2 = [2, 2, 2, 3, 2, 5, 2, 3, 5]
rr3 = [3, 5, 5, 2, 5, 2, 3, 5, 2]

for i in range(9):
 if addu[i] == 201:
  # Ketika nilai v = 8, operasi x += v tidak dieksekusi.
  s.add( (rr1[i]*arr[i]) + (rr2[i]*arr[i+9]) + (rr3[i]*arr[i+18]) != addu[i] )
 else:
  s.add( (rr1[i]*arr[i]) + (rr2[i]*arr[i+9]) + (rr3[i]*arr[i+18]) == addu[i] )

for i in range(9):
 if mulu[i] == 273:
  # Ketika nilai v = -65536, operasi x += v tidak dieksekusi.
  s.add( (rr1[i]+arr[i]) * (rr2[i]+arr[i+9]) * (rr3[i]+arr[i+18]) % 2273 != mulu[i] )
 else:
  s.add( (rr1[i]+arr[i]) * (rr2[i]+arr[i+9]) * (rr3[i]+arr[i+18]) % 2273 == mulu[i] )

# Sehingga nilai x sudah memenuhi kriteria pengecekan terakhir, yaitu 170385.

for i in range(7):
 s.add( (arr[i] ^ arr[i+7] ^ arr[i+14] ^ arr[i+21]) == xumu[i] )

www = s.check()
model = s.model()
fff = [0 for i in range(28)]

for i in range(28):
    index = eval(str(model[i])[2:])
    fff[index] = eval(str(model[model[i]]))

flag = "".join([chr(fff[i]) for i in range(28)])
print "Flag: {}".format(flag)
$ python solve.py
Flag: wHa7_k1nd_0f_bin4rY_i5_tHisz

Flag

HackToday{wHa7_k1nd_0f_bin4rY_i5_tHisz}