๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœ’๏ธ Capture The Flag (CTF)

[PwnMe CTF 2023] Just a XOR WriteUp

by A Lim Han 2023. 5. 6.

# Just a XOR WriteUp

 

1. ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•˜๊ณ , ํ•˜๋‹จ์˜ ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์•˜๋‹ค.

+ ๋ฌธ์ œ๋ฅผ ์ฝ์–ด๋ณด๋‹ˆ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ›ผ์†๋œ ์›๋ณธ ๋ฉ”์‹œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์•”ํ˜ธ๋ฌธ์„ ํ†ตํ•ด ์™„์ „ํ•œ ํ‰๋ฌธ์„ ๋ณต๊ตฌํ•ด๋‚ด๋Š” ๋ฌธ์ œ๊ฐ™๋‹ค.

 

 

 

 

2. ๋‹ค์šด๋ฐ›์€ ์••์ถ•ํŒŒ์ผ ์•ˆ์—๋Š” ์ด 3๊ฐ€์ง€์˜ ํŒŒ์ผ์ด ์žˆ์—ˆ๋‹ค.

 

 

 

 

3. ๋จผ์ € encrypt ํŒŒ์ผ์„ ๋จผ์ € ํ™•์ธํ•ด๋ณด๊ณ , ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด๋ณด์•˜๋‹ค.

+ < Line 1 ~ 2 >

: random๊ณผ itertools ๋ชจ๋“ˆ์„ import

 

+ < Line 5 >

: original-message.txt ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์–ด์™€ MESSAGE ๋ณ€์ˆ˜์— ์ €์žฅ

 

+ < Line 6 >

: ์ด 16๊ฐœ์˜ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ SECRET ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ

--> ๋‚œ์ˆ˜๋Š” 0๋ถ€ํ„ฐ 0x2600์„ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ ๊ฐ’์œผ๋กœ ์ƒ์„ฑ

 

+ < Line 8 ~ 9 >

: ์•”ํ˜ธํ™” ํ•จ์ˆ˜ encrypt๊ฐ€ ์ •์˜๋œ ๋ถ€๋ถ„์œผ๋กœ, ์ž…๋ ฅ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ XOR ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜์—ฌ ์•”ํ˜ธํ™” + cycle ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ SECRET ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™”

 

+ < Line 12 ~ 13 >

: message-encrypted.txt ํŒŒ์ผ์„ ์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์—ด์–ด MESSAGE ๋ณ€์ˆ˜์— ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์•”ํ˜ธํ™”  -->  ','๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“  ํ›„ ํŒŒ์ผ์— ๋‚ด์šฉ ์ž‘์„ฑ

 

 

 

 

4. intercepted-original-mesage ํŒŒ์ผ๊ณผ message-encrypted ํŒŒ์ผ์„ ์—ด์–ด๋ณธ ๊ฒฐ๊ณผ, ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

 

 

 

 

5. ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋ณตํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

import ast
import random
from itertools import cycle

ENCRYPTED_MESSAGE = open("C:\\Users\\USER\\Desktop\\message-encrypted.txt", "r").read()
SECRET = [chr(random.randint(0,0x2600) % 256) for i in range(16)]

def decrypt(encrypted_message):
    encrypted_list = ast.literal_eval(encrypted_message)
    encrypted_chars = [chr(int(a) ^ ord(b)) for a, b in zip(encrypted_list, cycle(SECRET))]
    return ''.join(encrypted_chars)

original_message = decrypt(ENCRYPTED_MESSAGE)
print(original_message)

+ < Line 5 >

: message-encrypted.txt ํŒŒ์ผ์—์„œ ์•”ํ˜ธ๋ฌธ์„ ์ฝ์–ด์˜ค๊ณ , ์ด๋ฅผ ENCRYPTED_MESSAGE ๋ณ€์ˆ˜์— ์ €์žฅ

 

+ < Line 6 >

: 16๊ฐœ์˜ ๋žœ๋ค ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜์—ฌ SECRET ๋ณ€์ˆ˜์— ์ €์žฅ

 

+ < Line 8 ~ 11 >

: ๋ณตํ˜ธํ™” ํ•จ์ˆ˜ decrypt๋ฅผ ํ†ตํ•ด ์•”ํ˜ธ๋ฌธ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ast.literal_eval() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜  -->  XOR ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ‰๋ฌธ์œผ๋กœ ๋ณตํ˜ธํ™”

 

+ < Line 13 ~ 14 >

: decrypt ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ตฌํ•œ ํ‰๋ฌธ์„ ์ถœ๋ ฅ

 

 

 

 

6. ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณธ ๊ฒฐ๊ณผ ์•„๋ž˜์™€ ๊ฐ™์€ ์ถœ๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

+ ๋ณตํ˜ธํ™” ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ๊ฒƒ ๊ฐ™์•˜์ง€๋งŒ, ๊ฒฐ๊ตญ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋Š” ๋ชปํ•˜์˜€๋‹ค.