이번 문제는 지금까지 잘 풀어왔다면 굉장히 쉬운 문제다.
비교함수를 확인해보자.

대충 보면 암호문의 길이는 0x15고 imul연산과 and연산이 보인다.
[imul a, b, c] 연산은 [a = b * c]와 같다. 따라서 이 비교함수연산을 그대로 대입해보면
(input[i]*0xFB)&(0xFF) == enc[i]이다.
 
이를 역산식으로 만들면
input[i] == (enc[i]&(0xFF)) / (0xFB)
인데 파이썬에서 나눗셈은 무조건 float를 결과값으로 가진다. 타입변환이 귀찮기 때문에 브루트포스로 대입해서 비교하는 식으로 코드를 작성했다.
 

enc = 'AC F3 0C 25 A3 10 B7 25 16 C6 B7 BC 07 25 02 D5 C6 11 07 C5 00'
enc = enc.split(' ')

res = ''

for i in range(21): #0x15 == 21
    for j in range(32, 127): #printable ascii code
        if (j*0xFB)&(0xFF) == int(enc[i],16):
            print(chr(j), end='')

'Security > Reversing' 카테고리의 다른 글

Secure Mail  (0) 2022.07.13
Dreamhack rev-basic-9  (0) 2022.07.05
Dreamhack rev-basic-7  (0) 2022.06.21
Dreamhack rev-basic-6  (0) 2022.06.01
Dreamhack rev-basic-5  (0) 2022.05.28

+ Recent posts