CTF-Writeups

Vibe Code Writeup

Summary

The service feeds a one-line prompt to GPT-2, then extracts the first ```c fenced block from the model output and compiles it inside a jail. The prompt forbids literal newlines, and the C code is filtered for the substrings system, exec, and open. The solution is to embed the C code block using the Unicode line separator (U+2028) so it is still one line to the server, then call execve directly via syscall 59 (no blacklisted substrings needed) to run /readflag.

Challenge Analysis

Key logic from vibe_code.py:

Exploit Strategy

1) Bypass the newline restriction
Use U+2028 (Unicode Line Separator). Python splitlines() treats it as a newline, but the prompt is still a single line (no \n or \r), so the server accepts it.

2) Force a fenced C block
GPT-2 tends to repeat short payloads if the prompt begins with Write and the payload is short. This yields:

3) Avoid the blacklist
Call execve by raw syscall number 59. This avoids the literal substring exec and requires no open or system.

Payload

Prompt (single line, with U+2028 separators):

Write \u2028```c\u2028int main(){long syscall(long,...);char *a[]={"/readflag",0};syscall(59,"/readflag",a,a);}\u2028```

Extracted C code:

int main(){long syscall(long,...);char *a[]={"/readflag",0};syscall(59,"/readflag",a,a);}

Notes:

Proof-of-Work

The service requires kCTF PoW:

python3 <(curl -sSL https://goo.gle/kctf-pow) solve s.<...>

This is the standard sloth PoW. A local solver can implement sloth_root and return the encoded solution. Using gmpy2 makes it much faster.

Automated Solver

I used a small script to: 1) Grab the PoW challenge from the banner. 2) Solve it (fast with gmpy2). 3) Send the prompt and print the response.

Flag:

uoftctf{transformers_only_became_cool_with_gpt3.5_so_grats_on_making_it_work}