2011-03-04 69 views
27

Tôi đang cố gắng gỡ lỗi nhị phân sử dụng nhiều con trỏ. Đôi khi để nhìn thấy đầu ra nhanh chóng để tìm ra lỗi, tôi in ra địa chỉ của các đối tượng và giá trị tương ứng của chúng, tuy nhiên, các địa chỉ đối tượng được ngẫu nhiên và điều này đánh bại mục đích của việc kiểm tra nhanh này. Có cách nào để tắt tạm thời/vĩnh viễn để tôi nhận được các giá trị giống nhau mỗi lần tôi chạy chương trình hay không.Vô hiệu hóa việc ngẫu nhiên địa chỉ bộ nhớ

Rất tiếc. OS là Linux fsttcs1 2.6.32-28-generiC#55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

+1

Hệ điều hành nào? ...... – Orbit

+0

liên quan http://stackoverflow.com/questions/11238457/disable-and-re-enable-address-space-layout-randomization-only-for-myself –

Trả lời

20

Để tạm thời tắt ASLR cho một chương trình cụ thể, bạn luôn có thể phát hành những điều sau (không cần cho sudo)

setarch `uname -m` -R ./yourProgram 
+2

tôi thấy rằng 'setarch' tìm thấy đầu ra của 'uname -m' khó chịu trên các hệ thống ARM (ví dụ Raspberry Pi). Nhưng 'setarch linux32 -R./YourProgram' hoạt động tuyệt vời. –

+4

Một biến thể tốt đẹp là 'setarch \ 'uname -m \' -R $ SHELL'. Chúng sinh sản một vỏ với ASLR tàn tật, và bất kỳ lệnh bạn chạy từ vỏ đó cũng sẽ có ASLR vô hiệu hóa. – ntc2

+0

Oh tốt đẹp! Tôi thích điều đó rất nhiều! – Stephen

2

Bạn cũng có thể thực hiện điều này theo lập trình từ nguồn C trước UNIX exec.

Nếu bạn có một cái nhìn tại nguồn cho setarch (đây là một nguồn):

http://code.metager.de/source/xref/linux/utils/util-linux/sys-utils/setarch.c

Bạn có thể thấy nếu nắm để một cuộc gọi hệ thống (syscall) hoặc một cuộc gọi chức năng (tùy thuộc vào những gì hệ thống của bạn xác định). Từ setarch.c:

#ifndef HAVE_PERSONALITY 
# include <syscall.h> 
# define personality(pers) ((long)syscall(SYS_personality, pers)) 
#endif 

Trên hệ thống CentOS 6 64 bit của tôi, có vẻ như nó sử dụng hàm (có thể gọi là syscall cùng một ở trên). Hãy xem đoạn này từ tập tin bao gồm trong /usr/include/sys/personality.h (như tham chiếu như <sys/personality.h> trong mã nguồn setarch):

/* Set different ABIs (personalities). */ 
extern int personality (unsigned long int __persona) __THROW; 

gì nó boils xuống, là bạn có thể, từ mã C, gọi và thiết lập tính cách để sử dụng ADDR_NO_RANDOMIZE và sau đó exec (giống như setarch hiện).

#include <sys/personality.com> 

#ifndef HAVE_PERSONALITY 
# include <syscall.h> 
# define personality(pers) ((long)syscall(SYS_personality, pers)) 
#endif 

... 

void mycode() 
{ 
    // If requested, turn off the address rand feature right before execing 
    if (MyGlobalVar_Turn_Address_Randomization_Off) { 
    personality(ADDR_NO_RANDOMIZE); 
    } 
    execvp(argv[0], argv); // ... from set-arch. 
} 

Rõ ràng là bạn không thể tắt ngẫu nhiên địa chỉ trong quá trình bạn đang ở (grin: trừ khi có thể tải động), vì vậy điều này chỉ ảnh hưởng đến nhánh và người quản lý sau này. Tôi tin rằng cờ Địa chỉ ngẫu nhiên được thừa hưởng bởi các tiến trình con con?

Dù sao, đó là cách bạn có thể tắt tính năng ngẫu nhiên địa chỉ theo chương trình trong mã nguồn C. Đây có thể là giải pháp duy nhất của bạn nếu bạn không muốn lực lượng người dùng can thiệp thủ công và bắt đầu với setarch hoặc một trong các giải pháp khác được liệt kê trước đó.

Trước khi bạn khiếu nại về các vấn đề bảo mật khi tắt tính năng này, một số thư viện/công cụ bộ nhớ dùng chung (chẳng hạn như PickingTools shared memory và một số IBM databases) cần phải tắt tính năng ngẫu nhiên địa chỉ bộ nhớ.

Các vấn đề liên quan