[CTF Writeup / Reversing] IrisCTF 2024 - Rune? What's that?

Rune? What's that?

Rune? Like the ancient alphabet?



go lang으로 짜여진 encrypt 코드가 있고, 암호화된 데이터파일 "the"가 있다. 다음은 go lang으로 짜여진 encrypt 코드다.

package main

import (
"fmt"
"os"
"strings"
)

var flag = "irisctf{this_is_not_the_real_flag}"

func init() {
runed := []string{}
z := rune(0)

for _, v := range flag {
runed = append(runed, string(v+z))
z = v
}

flag = strings.Join(runed, "")
}

func main() {
file, err := os.OpenFile("the", os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
fmt.Println(err)
return
}

defer file.Close()
if _, err := file.Write([]byte(flag)); err != nil {
fmt.Println(err)
return
}
}


로직은 단순하다. 평문 한글자씩 연산을 하는데, z 변수의 값을 더한 뒤, z를 현재 평문으로 덮어쓰는 로직이다. 다음은 암호화된 파일의 내용이다.


iÛÛÜÖ×ÚáäÈÑ¥gebªØšÔž’Íãâ£i¥§²ËÅÒÍÈä


z의 초기값이 0이었기 때문에, 첫 글자는 평문 i가 그대로 저장된다. 이제 이를 decrypt 하는 코드를 짜서 돌리면 플래그를 얻을 수 있다.


with open('the', 'rb') as f:
data = list(f.read().decode())


flag = []
z = 0

for i, enc_c in enumerate(data):
dec_c = ord(enc_c) - z
z = dec_c
flag.append(chr(dec_c))


print(''.join(flag))


역연산은 z값을 차감해가며 리스트에 추가하고, 구해진 플래그 글자를 z에 넣으면서 글자수만큼 반복하면 된다.


irisctf{i_r3411y_1ik3_num63r5}

















댓글