[Christmas 2020] REVERSING - screw_driver
by jennysgapChallenge:

Analysis:
sub_140002F10() 함수에서 3단계로 수행된다.
- if (v4 == 0x222004)
- file 파일을 읽어 word_140005060에 저장
- else if (v4 == 0x222008)
- word_140005040[0:25] = word_140005060[4:29]
- word_140005060[0:4]에 "XMAS" 문자로 덮어씌우기
- if (v4 == 0x222000)
- 미리 셋팅되어 있는 값(word_140005008)과 word_140005060 값(역순)을 xor 연산하여 str1에 저장
- str2는 input값으로 str1과 비교하여 일치하지 않으면 프로그램 종료
- str2[0:4]에 word_140005060[0:4] 덮어씌우기
- 그리고 마지막으로 while문 연산
- 연산 후의 str2 값이 flag 값이 된다.
Solve:
#!/usr/bin/env python2 #-*- coding: utf-8 -*- # # CTF: Christmas 2020 # screw driver (REV) # # if ( v4 == 0x222004 ) f = open('./file', 'r') buf = f.read() f.close() buf_5060 = [0 for i in range(29)] for i in range(0, 29): buf_5060[i] = buf[i] # else if ( v4 == 0x222008 ) buf_5040 = [0 for i in range(32)] for i in range(4, 29): buf_5040[i-4] = buf_5060[i] buf_5060[0:4] = 'XMAS' # if ( v4 != 0x222000 ) buf_5008 = [0x73, 0x6B, 0x0C, 0x6A, 0x54, 0x0D, 0x52, 0x3F, 0x0C, 0x64, 0x6C, 0x2E, 0x65, 0x4A, 0x33, 0x0B, 0x43, 0x4E, 0x40, 0x26, 0x7F, 0x72, 0x1F, 0x68, 0x5B, 0x63, 0x34, 0x03, 0x3C] str1 = [] for i in range(len(buf_5060)): str1.append(chr(buf_5008[i] ^ ord(buf_5060[28-i]))) str2 = str1 print('input: ' + ''.join(str2)) str2[0:4] = buf_5060[0:4] v4 = 0 v8 = -1 v11 = 1 v5 = 4 v7 = 5 v6 = 0 while(1): for j in range(v7): v8 += v11 str2[v5] = chr(v6 + (ord(buf_5040[5*v4+v8]) ^ ord(str2[v5]))) v5+=1 v6+=1 v7-=1 if (v7<=0): break for k in range(v7): v4 += v11 str2[v5] = chr(v6 + (ord(buf_5040[5*v4+v8]) ^ ord(str2[v5]))) v5+=1 v6+=1 v11 = -1 * v11 print('output: ' + ''.join(str2))
Flag:
XMAS{Y0u_@r3_tH3_b35t_dRiv3r}
반응형
블로그의 정보
jennysgap
jennysgap