Hack4S3cur1ty

[Seccon Beginners 2018][Rev] crackme 본문

CTFs/2018

[Seccon Beginners 2018][Rev] crackme

h4ck4s3cur1ty 2018. 5. 28. 22:59

바이너리를 IDA로 까보면 값을 입력받고 연산을 거친뒤 해당 연산에 맞는 플래그를 알려준다.


디버깅 하면 쉽게 구할 수 있을거같지만 귀찮고 연산이 짧으니 정적분석으로 풀었다.


첫번째 연산을 보면 테이블이 있고 테이블 값과 0xFF를 xor 연산을 하면서 비교한다. 비교에 실패하면 flag값 처럼 1을 리턴한다


그 후 0xFF에 다시 특정값을 xor 한 뒤 그 값을 다음 테이블 값과 연산한다.


두번째 연산도 같은 방식이다.


간단하게 파이썬 코드를 짜서 풀 수 있다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
table = [0x9C0x9E0x8C0x3E0x680x640x7B0x3F0x500x630x0A0x7F0x550x730x1E0x64]
table2 = [0x3C0x550x7B0x6E0x600x5D0x340x260x260x650x6D0x370x390x790x3F0x28]
byte_601048 = 0xFF
flag = ''
 
for i in range(0164):
    flag += chr(table[i] ^ byte_601048)
    byte_601048 ^= 0x15
 
    flag += chr(table[i+1] ^ byte_601048)
    byte_601048 |= 0x20
 
    flag += chr(table[i+2] ^ byte_601048)
    byte_601048 &= 0x0f
 
    flag += chr(table[i+3] ^ byte_601048)
 
for j in range(0164):
    flag += chr(table2[j] ^ byte_601048)
    byte_601048 &= 0x0a
 
    flag += chr(table2[j+1] ^ byte_601048)
    byte_601048 /= 3
 
    flag += chr(table2[j+2] ^ byte_601048)
    byte_601048 ^= 0x55
 
    flag += chr(table2[j+3] ^ byte_601048)
 
print flag
cs


Comments