2015-04-29 27 views
1

我已經看到了緩衝區溢出代碼,但我不能超過它。有沒有gcc選項來編譯它?或者該代碼有任何問題。我不能溢出緩衝區

的代碼是:

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

int main(int argc, char **argv) 
{ 
    volatile int modified; 
    char buffer[64]; 

    if(argc == 1) { 
      errx(1, "please specify an argument\n"); 
    } 

    modified = 0; 
    strcpy(buffer, argv[1]); 

    if(modified == 0x61626364) { 
      printf("you have correctly got the variable to the right value\n"); 
    } else { 
      printf("Try again, you got 0x%08x\n", modified); 
    } 
} 

,我試圖運行這樣說:
perl -e 'print "A"x64 . "dcba"' | xargs ./main

+0

這看起來非常棘手,無需查看生成的代碼即可正確使用。你有什麼?這個過程是否會崩潰? – cnicutar

+0

溢出緩衝區將寫入其後的內存,但「修改」可能位於其之前的內存中(取決於編譯器)。 – interjay

+0

這是一個ctf挑戰[here](http://exploit-exercises.com/protostar/stack1)是 –

回答

1

你需要知道

  1. 知道棧內存佈局和地址變量modifiedbuffer之間的差異 您可以通過查找fset之間的修改和緩衝區爲(char *)&modified - (char *)buffer
  2. 您的機器endianess。我爲此使用了stack overflow答案

鏈接演示瞭如何運行修改後的代碼,以確定正確參數以及堆棧粉碎的目的。第一個Demo爲您提供了一個論據,您可以將其提供給您的第二個Demo

+0

它使用'--no-stack-protector'選項 –