簡體   English   中英

使用snprintf的緩沖區溢出

[英]Buffer overflow using snprintf

這是一項任務,但是我對基本的理解有疑問。

易受攻擊的代碼:

int choc(char *arg)
{
  char buf[400];
  snprintf(buf, sizeof buf, arg);
  return 0;
}

我知道arg需要是一個格式字符串,它將用我要執行的代碼的地址覆蓋返回地址。 但是我在創建格式字符串時遇到了麻煩。

因此,格式字符串需要具備的內容:

  1. 返回指令的地址,我需要覆蓋它
  2. %x的清單
  3. 我將在回信地址上寫入的值。 這就是我要執行的代碼的地址。

為了獲得返回地址,我只需要查看gdb中“ ret”指令的地址,對嗎? %x的確切目的是什么? 以及如何以格式字符串編碼要執行的代碼的地址?

我做了一個測試:使用gdb,我發現buf的地址是0xbffffba0。 我生成的arg為“ \\ xa0 \\ xfb \\ xff \\ xbf_%x。%x。%n”; 這不應該在buff的起始地址0xbffffba0處寫入一些值嗎? 但是我遇到了段錯誤。 我究竟做錯了什么?

任何幫助,將不勝感激!

"\\xa0\\xfb\\xff\\xbf"不應是buf的地址,而應是返回地址在堆棧上的位置(這是您希望覆蓋的值)。 您必須使用gdb找到該值。

然后,您需要在格式字符串中放入足夠的%x,以使%n可以從堆棧中讀取該值並寫入您指定的地址。 您還需要使用正確的字段大小,以使%n實際寫入正確的值。

您嘗試利用的漏洞稱為格式字符串漏洞。 為了對此主題進行進一步的研究,我建議您使用鏈接或名為“黑客:剝削的藝術”的書。

從調試器中讀取值通常是不夠的。 某些平台具有地址空間隨機化安全功能,這將導致特定對象的地址在程序調用之間有所不同。 相反,您將要查找返回地址在堆棧中的存儲位置(相對於snprintf調用)並將其覆蓋。 這是非常特定於CPU的。 您正在開發什么平台?

使用調試器,在匯編級別逐步瀏覽該功能的代碼,並在遇到return命令之前檢查堆棧。 確保堆棧和寄信人地址看起來像您認為的樣子。 這應該為您提供有關問題所在的線索。 另外,您可以嘗試在return之前使用調試器手動修改堆棧,以驗證您所定位的位置實際上是返回地址。

答案是否定的,您不僅需要“ ret”指令的地址。 您真正需要的是“ ret”指令在內存中的位置。 看一下這個圖:

http://post.queensu.ca/~trd/377/tut5/stack.html

您打算覆蓋“寄信人地址”。

我將繼續嘗試編寫一個簡短的程序來顯示該指針(即將出現)。

更新:我有個壞消息。 我也不知道。 我寫過:

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

void bar()
{
    printf("Bar function\n");
}

void foo()
{
    void (**p)(void);
    asm volatile("movl %%ebp, %0\n\t" : "=r"(p) : : "%0");
    p += 1;
    *p = bar;
}

int main()
{
    foo();
    return 0;
}

這會導致分段錯誤,而不會在bar()打印句子。 我希望它能起作用...所以現在我和您一樣困惑。 誰能解釋為什么bar()無法在我的代碼中執行?

暫無
暫無

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

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