Skip to content
This repository was archived by the owner on Jun 24, 2026. It is now read-only.

Commit 5a8be6a

Browse files
committed
feat: rename /flag -> /flag2
1 parent 893eacc commit 5a8be6a

4 files changed

Lines changed: 13 additions & 13 deletions

File tree

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
1010
ENV PATH="/root/.cargo/bin:${PATH}"
1111

1212
ARG FLAG2
13-
RUN printf '%s\n' "${FLAG2}" > /flag && chmod 444 /flag
13+
RUN printf '%s\n' "${FLAG2}" > /flag2 && chmod 444 /flag2
1414

1515
COPY . /build/
1616
WORKDIR /build
@@ -24,7 +24,7 @@ RUN apt-get update && apt-get install -y socat \
2424
&& useradd -m -s /bin/bash ctf
2525

2626
COPY --from=build /build/target/release/nanolog /challenge/nanolog
27-
COPY --from=build /flag /flag
27+
COPY --from=build /flag2 /flag2
2828

2929
RUN chmod 755 /challenge/nanolog \
3030
&& chown -R ctf:ctf /challenge

solution/flag2/README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,13 @@ Le code source contient une fonction qui n'est appelée nulle part :
9292

9393
```rs
9494
fn win(_ctx: *const u8) {
95-
if let Ok(flag) = std::fs::read_to_string("/flag") {
95+
if let Ok(flag) = std::fs::read_to_string("/flag2") {
9696
// imprime le flag
9797
}
9898
}
9999
```
100100

101-
`win` lit `/flag` et l'imprime. Elle n'est jamais invoquée par le programme :
101+
`win` lit `/flag2` et l'imprime. Elle n'est jamais invoquée par le programme :
102102
le seul moyen de l'atteindre est de détourner le flot d'exécution vers elle.
103103

104104
Si on écrit `&win` dans `callback`, alors `admin_show` exécutera `win` et le
@@ -149,7 +149,7 @@ win_runtime = base_PIE + offset_statique(win)
149149

150150
`offset_statique(win)` se lit, comme pour `banner`, dans le binaire. (Dans le
151151
binaire livré, strippé, `win` se reconnaît à son appel à `read_to_string` /
152-
ouverture de `/flag`.)
152+
ouverture de `/flag2`.)
153153

154154
### Forge du `Some(win)`
155155

@@ -165,7 +165,7 @@ Côté `AdminRecord`, `callback` vaut maintenant `Some(win)`.
165165
### Déclenchement
166166

167167
`admin_show(0)` lit `Some(cb)` avec `cb == win`, et appelle `cb(ptr)`. `win`
168-
lit `/flag` et l'imprime.
168+
lit `/flag2` et l'imprime.
169169

170170
> Détail sur l'alignement : l'appel indirect saute à l'entrée de `win`, une
171171
> fonction Rust ordinaire dont le prologue rétablit l'alignement de pile avant
@@ -253,13 +253,13 @@ The source contains a function called nowhere:
253253

254254
```rs
255255
fn win(_ctx: *const u8) {
256-
if let Ok(flag) = std::fs::read_to_string("/flag") {
256+
if let Ok(flag) = std::fs::read_to_string("/flag2") {
257257
// prints the flag
258258
}
259259
}
260260
```
261261

262-
`win` reads and prints `/flag`. The only way to reach it is to hijack control
262+
`win` reads and prints `/flag2`. The only way to reach it is to hijack control
263263
flow into it. Writing `&win` into `callback` makes `admin_show` execute `win`.
264264

265265
### The obstacle: PIE and ASLR
@@ -289,7 +289,7 @@ win_runtime = base_PIE + static_offset(win)
289289
```
290290

291291
In the stripped shipped binary, identify `win` by its `read_to_string` /
292-
`/flag` open call.
292+
`/flag2` open call.
293293

294294
### Forging `Some(win)`
295295

@@ -300,7 +300,7 @@ payload[8:16] = struct.pack("<Q", win_runtime) # callback = Some(win)
300300

301301
### Trigger
302302

303-
`admin_show(0)` calls `cb(ptr)` with `cb == win`; `win` prints `/flag`.
303+
`admin_show(0)` calls `cb(ptr)` with `cb == win`; `win` prints `/flag2`.
304304

305305
> Alignment note: the indirect call lands at `win`'s entry, an ordinary Rust
306306
> function whose prologue restores stack alignment before any inner call.
@@ -393,7 +393,7 @@ log.success(f"Flag 1 : {p.recvline().strip().decode()}")
393393
# Flag 2 : forge Some(win) a l'offset 8
394394
payload[8:16] = struct.pack("<Q", win_rt)
395395
edit_ref(p, 0, bytes(payload))
396-
p.sendline(b"9") # admin_show -> cb == win -> imprime /flag
396+
p.sendline(b"9") # admin_show -> cb == win -> imprime /flag2
397397
p.sendlineafter(b"Enter index: ", b"0")
398398

399399
data = p.recvall(timeout=3)

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ fn banner(_ctx: *const u8) {}
2525

2626
fn win(_ctx: *const u8) {
2727
use std::io::Write;
28-
if let Ok(flag) = std::fs::read_to_string("/flag") {
28+
if let Ok(flag) = std::fs::read_to_string("/flag2") {
2929
let stdout = std::io::stdout();
3030
let mut h = stdout.lock();
3131
let _ = writeln!(h, "{}", flag.trim());

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const WELCOME_MESSAGE: &str = "\
1616

1717
fn main() -> io::Result<()> {
1818
std::env::var("FLAG1").expect("FLAG1 environment variable not set -- refusing to start");
19-
std::fs::read_to_string("/flag").expect("/flag file not found or empty -- refusing to start");
19+
std::fs::read_to_string("/flag2").expect("/flag2 file not found or empty -- refusing to start");
2020

2121
println!("{WELCOME_MESSAGE}");
2222

0 commit comments

Comments
 (0)