CTF

2022 MetaRed CTF

Namchun 2022. 11. 13. 16:50

- 2022.11.7

- Rating weight: 23.58

- 리버싱, 포너블 문제는 없었고 대부분이 암호학, MISC, Forensic 문제였다.


  • Cryptography
    • Find the message
    • How can I retrieve the message
  • Forensic
    • Get your flag
  • Criptography
    • Take my key
    • Variables and more variables
  • General Skills
    • Find a Flag
    • Binary in sigth
    • Get the flag
    • Bad Code

Cryptography

Find the message

해당 문자열을 보니

flag가 특수문자를 제외하고 알파벳만 밀려있는 듯한 모습이다.

https://rot13.com/

 

rot13.com

rot13.com Please enable JavaScript to use this page. ↓ ROT1 ROT2 ROT3 ROT4 ROT5 ROT6 ROT7 ROT8 ROT9 ROT10 ROT11 ROT12 ROT13 ROT14 ROT15 ROT16 ROT17 ROT18 ROT19 ROT20 ROT21 ROT22 ROT23 ROT24 ROT25 ↓

rot13.com

해당 사이트에서 rot13을 돌려보니 flag가 나왔다

Fl@g{A_s0ld13r shoOt$, a hAck3R g!ves 3nteR}


How can I retrieve the message

소수 한쌍에 대한 이야기가 나온 것으로 보아 IF는 N으로 생각하고 복호화를 진행하였다.

from Crypto.Util.number import *

IF = 10403
e = 8743
c = 99

# IF = 101 * 103
p = 101
q = 103
phi = (p-1)*(q-1)
d = inverse(e, phi)

print(pow(c, d, IF))

9366


Forensic

Get your flag

문제에서 binary 파일을 주었다.

대부분의 이런 포렌식 첫 번째 문제는 hxd로 열어보면 flag가 있는 경우가 많다

우선 flag 포멧을 모르고 있어서 flag라고 검색하였더니 바로 나왔다.

flag{T3@m_H3rE_1s_yU0r_Fl@G_XD}


Criptography

Take my key

문제에서 Alice와 Bob은 공개키로 p와 g를 고르고,

Alice는 x를, Bob은 y를 골랐다고 한다. 이들의 대칭키는?

p와 g를 공개하는 것으로 보아 디피헬만 키 교환 알고리즘이라고 생각하였고

위의 알고리즘에서 대칭키를 생성하는 방식대로 만들어보았다.

p = 101 
g = 17
x = 19 
y = 13

key = g**(x*y) % p
print(key)

14


Variables and more variables

문제에서 p, q, e, c를 알려주었으니 간단하게 풀 수 있다.

from Crypto.Util.number import *

p = 7
q = 11
e = 13
c = 17

n = p*q
phi = (p-1)*(q-1)
d = inverse(e, phi)

print(pow(c, d, n))

52


General Skills

Find a Flag

해당 문제에서 주는 파일을 다운받고 압축을 풀어보면

이런 식으로 great_author 폴더 안에 3개의 폴더가 있고

각각의 폴더들 안에도 폴더 / 폴더 / 폴더 이런 형식으로 되어있다.

문제에서는 oliver_twist.txt를 찾으라고 하였으니 everything을 이용하여 빠르게 찾아보았다.

fl@g{Ch@rRl3$_D1cK3N$}


Binary in sigth

binary 파일과 script 파일이 주어지고

script 파일을 실행하였더니 별 달라지는 게 없어서 hxd로 binary 파일을 열어보았다.

문제의 이름대로 눈 앞에 바로 있었다.

Fl@g{Mr_Rob0t_3th1c4l_H@ck3R25}


Get the flag

포렌식 Get your flag 문제와 동일한 방식으로 풀었다.

flag{grep_is_a_good_tool}


Bad Code

문제에서 준 파일을 열어보니

import random



def str_xor(secret, key):
    #extend key to secret length
    new_key = key
    i = 0
    while len(new_key) < len(secret):
        new_key = new_key + key[i]
        i = (i + 1) % len(key)        
        
   return "".join([chr(ord(secret_c) ^ ord(new_key_c)) for (secret_c,new_key_c) in zip(secret,new_key)])


flag_enc = chr(0x01) + chr(0x21) + chr(0x08) + chr(0x19) + chr(0x21) + chr(0x51) + chr(0x5c) + chr(0x40) + chr(0x3a) + chr(0x24) + chr(0x5d) + chr(0x21) + chr(0x20) + chr(0x07) + chr(0x0a) + chr(0x04),

  
flag = str_xor(flag_enc, 'enkidu')
  print('That is correct! Here\'s your flag: ' + flag)

이런 식으로 들여쓰기가 문제 있는 것으로 보여서 고친 다음 실행을 하였지만 에러가 나왔다.

그러곤 한참 구글링해보며 처음부터 따라서 코드를 적던 중

flag_enc 변수 끝에 필요없는 , 가 붙어있었다.

이를 지우고 실행하니 flag가 나왔다.

dOcpE$9.QM9TEiam


문제를 9개나 풀어서 기분은 좋았지만

실력이 늘만한 문제는 없었어서 아쉬웠다.