簡體   English   中英

無論緩沖區大小如何,都無法訪問 $eip - gdb

[英]Cannot access $eip no matter the size of the buffer - gdb

我有以下 C 文件 vuln.c,我正在嘗試進行緩沖區溢出攻擊。 我的目標是將$eip設置為函數 read_secret 的地址。

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

void read_secret() {
    FILE *fptr = fopen("/task2/secret.txt", "r");
    char secret[1024];
    fscanf(fptr, "%512s", secret);
    printf("Well done!\nThere you go, a wee reward: %s\n", secret);
    exit(0);
}

int fib(int n)
{
   if ( n == 0 )
      return 0;
   else if ( n == 1 )
      return 1;
   else
      return ( fib(n-1) + fib(n-2) );
} 

void vuln(char *name)
{
    int n = 20;
    char buf[1024];
    int f[n];
    int i;
    for (i=0; i<n; i++) {
      f[i] = fib(i);
    }
    strcpy(buf, name);
    printf("Welcome %s!\n", buf);
    for (i=0; i<20; i++) {
      printf("By the way, the %dth Fibonacci number might be %d\n", i, f[i]);
    } 
}


int main(int argc, char *argv[])
{
    if (argc < 2) {
        printf("Provide your name\n");
        return 0;
    }

    vuln(argv[1]);
    return 0;
}

到目前為止,使用 gdb,當我將輸入的大小推送到 1026 時,我會遇到分段錯誤。也就是說, run $(python -c "print('A'*1026)")

但是,無論我將 1026 增加多少, $eip始終是0x8049323 我在網上找了很長時間來尋找任何類似的問題,但我沒有找到任何問題。

我知道有類似代碼的類似問題,但答案並沒有解決我的問題。

編輯:作為參考,是的,x41 確實可以使用,但它們從未一直到達 $eip。

在此處輸入圖片說明

此外,這些是輸入被 strcpy 輸入之前和之后的信息注冊。

之前 在此處輸入圖片說明

在此處輸入圖片說明

而buf變量的地址前后都是0xffffd230。 而 read_secret() 的地址是 0x80491c2。

問題是在程序內部出現了一個程序試圖打印 f[i] 的地方。 這些被緩沖區覆蓋到非法地址(即 0x41414141)。

相反,我所做的是我從“info reg”($ebp)中選擇了一個為我工作的地址,並多次插入該地址,直到我點擊了 $eip。 本質上,您想在這里選擇一個合法地址。

然后,我會減少我選擇的地址重復的次數,並添加一個“AAAA”來查看 $eip 的位置。 找到 $eip 后,我將要執行的函數的地址放在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM