簡體   English   中英

緩沖區溢出攻擊

[英]Buffer Overflow Attack

我正在嘗試執行一個非常簡單的緩沖區溢出攻擊。 我幾乎是新手。 所以,如果這個問題很愚蠢,請原諒:-)

代碼:

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

int i, n;

void confused(int i) 
{
 printf("**Who called me? Why am I here?? *** %x\n ", i);
}

void shell_call(char *c) 
{
 printf(" ***Now calling \"%s\" shell command *** \n", c);
 system(c);
}

void victim_func()
{
 int a[4];
 printf("Enter n:  ");  scanf("%d",&n);
 printf("~~~~~~~~~~~~~ values and address of n locations ~~~~~~~~~~");
 for (i = 0;i <n ;i++) 
  printf ("\n a[%d] = %x, address = %x", i, a[i], &a[i]);
 printf("\nEnter %d HEX Values \n", n);

 // Buffer Overflow vulnerability HERE!

 for (i=0;i<n;i++)  scanf("%x",&a[i]);
   printf("Done reading junk numbers\n");
}

int main() 
{
 victim_func();
 printf(“\n done”);
 return 0; 
}

當我使用objdump獲取函數地址時,我有以下內容:

main(): 0x804854d
Address of main() where printf() is called: 0x8048563
victim_func(): 0x8048455
confused(): 0x8048414

現在,我想要的是通過溢出緩沖區來從victim_func()跳轉到函數'confused()',並將返回地址覆蓋到confused()的地址。 我想從confused()返回到main中的printf()語句,然后正常退出。 所以,我提供以下輸入

Enter n: 7
Enter 7 HEX values:
1
2
3
4
5
8048414 (This is to jump to confused)
8048563 (this is to jump to printf() in main)

雖然程序從該printf語句打印“Done”,但它會跳回victim_func()並打印“Enter n:”

我究竟做錯了什么? 任何幫助將不勝感激!

PS:我不確定我是否提出了正確的問題。 如果需要更多信息,請告訴我。

緩沖區溢出攻擊比這復雜得多。 首先,您需要了解匯編程序才能執行此操作。 在反匯編您想要定位的程序和函數后,您需要在執行該函數時確定堆棧布局。 這是一個緩沖區溢出的示例,它使用visual studio,但原理是相同的。

#include "stdafx.h"
#include <math.h>

volatile double  test;

double function3()
{
    test++;
    return exp(test);
}

double  function2()
{
    return log(test);
}

double  function1()
{
    int a[5] = {0};           
    a[7] = (int)&function3;
    return exp(function2());

}
int _tmain(int argc, _TCHAR* argv[])
{
    double a = function1();
    test = a;
    return a;
}

由於反匯編,我們知道函數1在函數保存堆棧幀指針之前被分配。 之后的值是function1應該完成的返回地址。

00401090 55               push        ebp    <- we save the stack pointer
00401091 8B EC            mov         ebp,esp 
00401093 83 EC 1C         sub         esp,1Ch <- save space to allocate a[5]
00401096 B8 CC CC CC CC   mov         eax,0CCCCCCCCh 
0040109B 89 45 E4         mov         dword ptr [ebp-1Ch],eax  <- crt debug init a[5]  
0040109E 89 45 E8         mov         dword ptr [ebp-18h],eax 
004010A1 89 45 EC         mov         dword ptr [ebp-14h],eax 
004010A4 89 45 F0         mov         dword ptr [ebp-10h],eax 
004010A7 89 45 F4         mov         dword ptr [ebp-0Ch],eax 
004010AA 89 45 F8         mov         dword ptr [ebp-8],eax 
004010AD 89 45 FC         mov         dword ptr [ebp-4],eax 

由此我們可以得出結論,如果我們用不同的地址覆蓋[7],函數將不返回main,而是返回我們在[7]中寫入的任何地址。

希望這可以幫助。

現在,我想要的是通過溢出緩沖區來從victim_func()跳轉到函數'confused()',並將返回地址覆蓋到confused()的地址......

在現代Linux平台上,您還需要確保關閉兩個安全功能以進行測試。 首先是NX-stacks,其次是Stack Protectors。

要關閉NX-Stacks,請使用-Wl,z,execstack (與-Wl,z,noexecstack )。 要關閉堆棧保護器,請使用-fno-stack-protector (與-fstack-protector-fstack-protector-all相反)。

您可能需要關閉第三種保護措施。 這種保護是FORTIFY_SOURCE。 FORTIFY_SOURCE使用“更安全”的高風險函數變體,如memcpystrcpy 當編譯器可以推導出目標緩沖區大小時,編譯器會使用更安全的變體。 如果副本超過目標緩沖區大小,則程序調用abort() 要禁用FORTIFY_SOURCE,請使用-U_FORTIFY_SOURCE-D_FORTIFY_SOURCE=0編譯程序。

默認情況下會啟用安全功能,因為過去存在很多問題。 一般來說,這是一件好事,因為它可以解決許多問題(比如你正在試驗的問題)。

首先,在我看來,你不應該在你的樣本輸入中輸入數字5。 你的數組聲明為[4],因此元素索引為0-3 - 所以你的攻擊輸入對我來說似乎不對。

在我看來,您的程序假設有關架構的幾件事:

  • sizof(int)== sizeof(內存地址)
  • 環境堆棧實現的增長方向和機制

如果其中一個假設是不真實的,它就永遠不會起作用。

這似乎是一項非常艱苦的工作任務。

緩沖區溢出攻擊的簡單示例比更改代碼的控制流更容易。 例如,您可能能夠覆蓋應該受到用戶保護的另一段數據(例如安全設置)

您沒有向我們展示程序的輸出,其地址為[i]。 我懷疑編譯器正在做一些事情,比如將堆棧上的數據與16對齊。它可能比返回地址遠遠超出預期。

暫無
暫無

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

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