fastbin_tutorial - InterKosenCTF2019

方針 公式writeupでは、Use After Freeでやっているのですが、 Double Free Tutorial!と出てくるので、double freeとfastbin unlink attackをやります。 注意点 最初に与えられるflagのアドレスから0x10を引かなければならない。 char *flag; : void setup(void) { setbuf(stdin, NULL); setbuf(stdout, NULL); setbuf(stderr, NULL); FILE *f = fopen("flag.txt", "r"); flag = malloc(0x50); if (f == NULL) { puts("[WARN] Please report this bug to the author."); exit(1); } fread(flag, 1, 0x50, f); fclose(f); malloc(0x100); // assure no leak by freed FILE buffer } 与えられたアドレスに直接繋ぐと、Oops! You forgot the overhead...?と教えてくれる。 flagは、mallocで確保されているので、本来のチャンクより+0x10のアドレスが返ってきている。malloc.c L1126 fastbin に addr_flagを繋ぐ あるチャンクに対して共有状態を作って、そのチャンクが返ってくるときにaddr_flagが返ってくるようにします。...

2022-05-07 · 2 分 · Me

shopkeeper - InterKosenCTF2019

方針 shop関数内にあるmoneyという変数をStack Overflowによって書き換えて、 十分なmoneyを手にして、Hopesを買う方法を取ります。 脆弱性を探す旅🐈 一つの脆弱性は、readline関数で無限に入力できることです。 void readline(char *buf) { char *ptr; for(ptr = buf; ; ++ptr) { // Vulnerable here if (read(0, ptr, 1) == 0) break; if (*ptr == '\n') { *ptr = 0x00; break; } } } もう一つは、文字列比較でstrcmp関数を使っていることです。 void shop(item_t *inventory) { char buf[LEN_NAME]; item_t *p, *t; int money = 100; また、shop関数の中で、moneyがローカル変数として定義されているので、 書き換えることができる場所を探します。 strcmp関数は'\0'から比較しない shop関数の中で呼ばれているpurchase関数では、 文字列比較に、strcmp関数が使われていますが、 マニュアルを見ると、次のように書かれています。 strncmp() is designed for comparing strings rather than binary data, characters that appear after a `\0' character are not compared....

2022-05-05 · 1 分 · Me