2012-04-06 21 views
7

Có ai trong số các bạn phải đối mặt với vấn đề sau đây khi bạn cố gắng ghi đè lên con trỏ $esp?Smashing Stack trên Ubuntu 11.10

Tất nhiên, thử kích thước bộ đệm hợp lệ luôn hoạt động! Tuy nhiên, khi bạn cố gắng tăng kích thước bộ đệm để ghi đè lên $esp và bạn quản lý thành công để chạm vào byte đầu tiên, byte thứ hai hoặc byte thứ ba của $esp nó hoạt động hoàn hảo. Nhưng, ngay sau khi bạn cố gắng ghi đè lên toàn bộ 4 byte của $esp nó hoàn toàn thay đổi nội dung của nó cũng như địa chỉ. Nó không hiển thị thêm 41 s nữa khi tôi sử dụng "A" để lấp đầy bộ đệm. Tôi đã đính kèm một ảnh chụp màn hình có thể nó sẽ giải thích chi tiết hơn. Cảm ơn tất cả.

#include <stdio.h> 
#include <string.h> 
int main(int argc, char** argv) 
{ 
    char buffer[500]; 
    strcpy(buffer, argv[1]); 
    return 0; 
} 

smash attempt

Trả lời

5

này liên quan đến việc thực hiện các NX emulation trong 32-bit hạt nhân phi PAE Ubuntu, và khi ngoại trừ CPU được nâng lên. Đối với vùng bộ nhớ bên dưới dòng mô phỏng NX (tức là "bên trong" vùng NX mô phỏng: từ địa chỉ 0 đến cuối đoạn văn bản của chương trình - nhỏ hơn địa chỉ cuối 0x08049000 của nhị phân này trong /proc/$pid/maps), phân đoạn được phân phối sau EIP đã cập nhật địa chỉ không hợp lệ thực sự. Đối với các địa chỉ trên dòng, lỗi được kích hoạt thông qua một đường dẫn khác báo cáo sự thất bại mà không di chuyển EIP về phía trước địa chỉ bị lỗi, thay vào đó là lệnh "ret" dẫn đến lỗi.

Bạn có thể thấy điều này trong gdb:

(gdb) x/1i $pc 
=> 0x8048454 <main+64>: ret  
(gdb) info reg esp 
esp   0xbffff54c  0xbffff54c 
(gdb) x/wx $esp 
0xbffff54c:  0x41414141 

Bạn cũng có thể thấy sự khác biệt trong cách các lỗi được báo cáo trong dmesg đầu ra. Đây là sản phẩm gắn liền với "508" nỗ lực:

[ 585.913896] a.out[1528] general protection ip:8048454 sp:bff1e8ec error:0 in a.out[8048000+1000] 

Và đây là dành cho "507":

[ 598.999760] a.out[1531]: segfault at 414141 ip 00414141 sp bfcac2c0 error 4 in libc-2.13.so[5e7000+178000] 

Nếu bạn khởi động với kernel PAE cài đặt, sudo apt-get install linux-image-$(uname -r)-pae, và bạn có một PAE CPU có khả năng, bạn sẽ thấy hành vi mà bạn mong đợi (kể từ khi mô phỏng NX sẽ bị vô hiệu hóa vì lợi ích của phần cứng NX), và tất cả 4 lần thử sẽ phân tách với các EIP mong đợi.