문제를 보면 입력 값이 총 4개의 함수를 거치면서 변환되고 이 값을 특정 값과 비교한다.
먼저 첫번째 함수를 보면 아래와 같이 개행문자를 널값으로 치환하여 문자열 끝처리를 한다.
두번째 함수는 문자열을 reverse 시키는 연산을 하는걸 볼 수 있다.
세번째 함수가 핵심 로직으로 연산이 역연산짜기 좀 까다로워서 Bruteforcing형태로 해결했다.
마지막 네번째 함수는 간단한 보수연산을 한다.
위 로직들에 맞춰 인풋의 각 자리별 문자를 BruteFocing하는 형태로 플래그를 구해줬다.
flagTable = [0x41,0x29,0xD9,0x65,0xA1,0xF1,0xE1,0xC9,0x19,0x09,0x93,0x13,0xA1,0x09,0xB9,0x49,0xB9,0x89,0xDD,0x61,0x31,0x69,0xA1,0xF1,0x71,0x21,0x9D,0xD5,0x3D,0x15,0xD5]
flag = ""
for i in xrange(len(flagTable)):
for j in xrange(256):
v1 = 2 * (j&0x55) | (j>>1)&0x55
v2 = 4 * (v1 & 0x33) | (v1 >> 2) & 0x33
result = 16 * v2 | (v2 >> 4)
if result&0xff == ~flagTable[i]&0xff:
flag += chr(j)
print "[*]Find Flag = " + flag[::-1]
[*]Find Flag = TWCTF{qpzisyDnbmboz76oglxpzYdk}
'CTF > Writeup' 카테고리의 다른 글
TAMUctf 19 Obfuscaxor (0) | 2019.03.22 |
---|---|
Pico CTF 2018 keygen-me-2 (0) | 2019.03.22 |
0CTF 2016 Quals : boomshakalaka (0) | 2019.03.14 |
SSCTF 2016 : Re1 (0) | 2019.03.13 |
Sharif University CTF 2016 : Serial (0) | 2019.03.11 |