[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}
댓글
댓글 쓰기