Write_Up/REV

[ISITDTU_CTF_2024] re01, animal Writeup

90mapt4 2024. 11. 8. 14:55
Reversing_re01

 

해당 문제를 IDA를 통해 열어보면 main함수에서 해시값과 비교하고, 조건에 부합하면 flag가 맞다는 문구를 출력하는것을 확인할 수 있다.

그치만 이 전에 IDA에서 TlsCallback함수가 존재하는 것을 볼 수 있다. TlsCallback함수는 main보다 먼저 실행되는 함수이기에 이 함수를 먼저 보게되면, 

임의로 flag라고 적어둔 주소에 값을 담아주고 what함수를 호출하는 것을 확인할 수 있다. 그리고 이 what함수에서 Flag라고 적어둔 주소에 담긴 값을 하나하나 0x35랑 xor연산하고 있는 것을 볼 수 있다. 

이렇게 main함수에 해시값 등등은 볼 필요가 없었고 TlsCallback함수를 먼저 확인하면 풀리는 문제였다.

 

flag : ISITDTU{Congrats_You_Solved_TLS_Callback_Re01_Have_Fun_:)}


reversing_animal

 

해당 문제 또한 IDA를 통해 열어보면 main함수에 flag를 입력하고 아래 입력한 flag에 대해 조건을 검증한다. 해당 조건들을 다 알맞게 맞추면 flag를 얻을 수 있다. 

 

하나하나 직접 계산하는 것은 비효율적이기 때문에 z3모듈을 사용한 python 페이로드를 작성해준다.

 

from z3 import *
s = Solver()
flag = [BitVec(f"flag[{i}]",32) for i in range(36)]
for i in range(36):
    s.add(flag[i]<0x80)
    s.add(flag[i]>0x1f)
s.add(flag[8]==97)
s.add(flag[33] == flag[34])
s.add(flag[19]==116)
s.add(flag[17]==0x63)
s.add(flag[18]==0x61)


v2 = flag[27]
v3 = flag[1]
v4 = flag[32]
v5 = flag[8]
v6 = flag[29]
s.add( v5 * v3 + v4 * v2 * flag[25] - v6 == 538738 )

v7 = flag[4]
v8 = flag[10]
v9 = flag[20]
s.add( flag[7] + v9 * v8 * v7 - flag[6] - flag[11] == 665370 )

v10 = flag[30]
s.add( flag[14] + (flag[16] - 1) * flag[31] - v10 * flag[22] ==0xFFFFF47F )

v11 = flag[18]
v12 = flag[33]
s.add( v12 + flag[3] - flag[9] - v11 - flag[11] - v7 == 0xFFFFFF41 )

s.add( v3 + v10 + v11 + flag[25] * v6 - v5 == 4853 )

v13 = flag[7]
v14 = flag[13]
s.add( v14 + flag[5] - v13 * flag[14] * flag[23] * flag[2] == 0xFADD6797 )

v15 = flag[9]
s.add( v14 + v15 * flag[5] * flag[12] + v2 * v8 == 873682 )

v16 = v15 * flag[21]
v17 = flag[6]
v18 = v11 * v16
v19 = flag[22]
s.add( v19 + flag[3] + v18 - v17 == 451644 )

v20 = flag[24]
s.add( flag[21] + flag[34] + v20 + v4 * flag[23] - v7 == 9350 )

v21 = flag[17]
v22 = flag[19]
v29 = flag[35]
v28 = flag[26]
s.add( v20 + v29 + flag[17] - v22 - v28 - v17 == 27 )

v23 = flag[15]
s.add( flag[14] + flag[13] + v23 + flag[23] * v22 - flag[3] == 11247)
v24 = v13 * flag[12]
v25 = flag[2]
s.add(v25 + v21 + v24 - v23 - flag[21] == 13297)
v26 = flag[0]
s.add(v5 + v29 + v28 + flag[28] - v26 - v9 == 266)
s.add(v25 + v21 + v26 + flag[12] * flag[28] - v3 == 10422)
s.add( v19 + v23 + flag[5] * v22 - flag[34] - flag[11] == 9883 )

s.add(v8 * v12 + flag[16] * (1 - v9) - v26 == 0xFFFFEA1C)
print(s.check())
m = s.model()
for i in range(36):
    print(chr(m.eval(flag[i]).as_long()),end="")

 

'Write_Up > REV' 카테고리의 다른 글

[HKCERT_CTF_2024] Baby Cracker, Yet another crackme Writeup  (1) 2024.11.18