2011-03-10 62 views
1

我用C/C++編寫代碼。破壞存儲在數據段中的靜態變量有哪些可能的方法?這是否被認爲是內存泄漏?我該如何破壞一個linux進程的數據段?

#include <stdio.h> 

int aaa[5]; 
int bbb; 
int main() 
{ 
     int i; 
     bbb=41; 
     for (i = 0; i < 6; ++i) 
       aaa[i] = 42; 
     printf("%d\n", bbb); 
     return 0; 
} 

上面的代碼打印bbb = 42而不是41,這是一個可能的原因。另一種方法是修改通過多個線程訪問的靜態數據 。

還有其他方法嗎?

+2

C或C++?兩者都是完全不同的語言。 –

+0

它是C++。不是C – cateof

回答

1

是的,有破壞全球變量的內容(你的變量是不是在您發佈的例子靜態)一種以上的方法。

指針是一種很好的工具,可以破壞內存並編寫程序不應該寫的地方。鑄造還可以添加一些興奮:

#include <iostream> 
using namespace std; 

int aaa[5]; 
int bbb; 

int main(void) // Do *your* main() functions always return a value???? 
{ 
    double * ptr_double = 0; 
    // Assign the pointer to double to point to the last integer. 
    // Treat the last integer in the array as a double. 
    aaa[4] = 45; 
    cout << "aaa[4] = " << aaa[4] << endl; 

    ptr_double = (double *)(&aaa[4]); 
    *ptr_double = 3.14159267; 
    cout << "aaa[4] = " << aaa[4] << endl; 

    return -1; 
} 

多線程,可以讓每個線程寫入全局變量,然後讓他們讀回值。在寫作之前和寫作之後放置隨機延遲可以更詳細地向你展示它是如何工作的。

另一種方法是將變量的地址分配給I/O硬件設備的目標寄存器,如UART。當UART接收到數據時,它將把該數據放入該變量中,而不考慮變量的用途。

一般來說,值寫入到它不應該的位置的代碼會被破壞。主要原因是緩衝區溢出:寫入比分配給變量更多的數據。硬件設備(如DMA控制器和USB控制器)也可能發生超限。另一個原因是通過指針:指針指向一個無效的位置。

變量可能會被堆棧溢出和堆溢出損壞。在許多體系結構中,這些結構向對方擴展。堆棧上太多變量或函數遞歸(或調用深度)可能會使堆棧覆蓋到堆中。同樣,從堆中分配太多內存可以使堆覆蓋堆棧。

與其研究如何破壞變量,我相信你應該努力提高代碼安全性:設計並編寫代碼,使其沒有緩衝區溢出,寫入正確的位置和共享變量受到多任務同時寫入的保護,線程。

4

不,這不是內存泄漏。內存泄漏是當您在免費商店(與malloc/new)分配,然後從未free/delete分配的塊。

2

注意,這是不確定的行爲,並且不保證:

int bbb; 
int aaa[5]; 
int main() 
{ 
    int i; 
    bbb=41; 
    for (i = 0; i < 6; ++i) 
      aaa[i] = 42; 
    printf("%d\n", bbb); 
    return 0; 
} 
g++ -o test test.cpp && ./test 
41 

在這種特殊情況下BBB存儲AAA後,但你不應該靠這個根本的原因也可能是別的地方。

+0

有沒有其他方法來破壞靜態全局變量? – cateof

+0

有沒有保證靜態全局變量的方法。如果你正在嘗試的是對已有代碼進行一些破解,我會嘗試自己註冊一個靜態變量,並在靜態變量內存地址的上下寫入一些垃圾字節。 –

+0

是否有可能在堆棧或堆中的錯誤損壞.data? – cateof

1

在執行過程中的任何代碼之前,所有全局變量(靜態或其他)都將被初始化爲在其聲明中指定的值(如果未指定,則爲零)。默認值只能通過進程內執行的代碼修改(禁止調試器的任何外部干擾)。

如果您在程序的main()函數的開頭看到「損壞」的值,很可能是由於在全局C++對象的構造函數中執行了錯誤的操作。所有全局C++對象的構造函數在調用main()之前運行。

追蹤這類腐敗來源的最簡單方法可能是在調試器下運行該過程,並在全局變量的地址上設置一個觀察點。數據修改時,調試器將中斷。機率是你有一個數組溢出或錯誤的指針問題。他們可能是一個婊子手動追蹤。

1

這是一個典型的編程錯誤。 您使用6個aaa來定義aaa數組的5個項目,這意味着您只能使用aaa [0],aaa [1],aaa [2],aaa [3]和aaa [4]。 aaa [5]是未定義的。 這是一個錯誤,一個編程錯誤,沒有別的。期。