Hack4S3cur1ty
[Seccon Beginners 2018][Rev] crackme 본문
바이너리를 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 = [0x9C, 0x9E, 0x8C, 0x3E, 0x68, 0x64, 0x7B, 0x3F, 0x50, 0x63, 0x0A, 0x7F, 0x55, 0x73, 0x1E, 0x64] table2 = [0x3C, 0x55, 0x7B, 0x6E, 0x60, 0x5D, 0x34, 0x26, 0x26, 0x65, 0x6D, 0x37, 0x39, 0x79, 0x3F, 0x28] byte_601048 = 0xFF flag = '' for i in range(0, 16, 4): 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(0, 16, 4): 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 |
'CTFs > 2018' 카테고리의 다른 글
[Seccon Beginners 2018][Pwn] condition (0) | 2018.05.28 |
---|---|
[Seccon Beginners 2018][MISC] てけいさんえくすとりーむず (0) | 2018.05.28 |
[Seccon Beginners 2018][Crypto] RSA is Power (0) | 2018.05.28 |
[Seccon Beginners 2018][Rev] Simple Auth (0) | 2018.05.28 |
[Seccon Beginners 2018][Rev] Activation (0) | 2018.05.28 |
Comments