2013-03-11 31 views
6

Tôi mới sử dụng stackoverflow, vì vậy tôi xin lỗi trước vì bất kỳ sai lầm nào tôi cam kết.Thay đổi bộ nhớ ngăn xếp từ chương trình C

Tôi đã xem qua câu đố C này Gần đây. Chương trình được đưa ra dưới đây.

#include<stdio.h> 

void change() 
{ 

} 

int main() 
{ 
printf("\nHello"); 
change(); 
printf("\nHai"); 
printf("\nHow are you?"); 
return 0; 
} 

Sản lượng dự kiến ​​là,

Hello 
Hai 
How are you? 

Vấn đề đòi hỏi chúng ta phải thay đổi sản lượng như sau bằng cách thêm một số mã trong sự thay đổi chức năng()

Hello 
How are you? 

Bạn đang không được phép thực hiện bất kỳ thay đổi nào trong chính().

Tôi đã cố gắng thay đổi địa chỉ trả về của thay đổi hàm() được lưu trữ trong bộ nhớ ngăn xếp và ở đó bằng cách tránh lệnh printf ("\ nHai"). Nhưng tôi nhận được lỗi khi tôi biên dịch bằng gcc.

Mã tôi đã thêm vào thay đổi() được hiển thị bên dưới.

void change() 
{ 
char ch; 
*(&ch+10)+=20; 
} 

Các giá trị thêm vào ch (10 và 20) được cố định bằng cách sử dụng

objdump -d ./a.out 

tôi hy vọng sẽ nhận được một số gợi ý để giải quyết vấn đề. Cám ơn bạn trước vì đã dành thời gian và kiên nhẫn của bạn.

+1

Bạn có thể đăng các lỗi bạn nhận được không? – nvoigt

+0

Trước tiên, bạn cần phải tháo rời để kiểm tra vị trí chính xác trong ngăn xếp giá trị trả về được lưu trữ. – m0skit0

+11

Tôi coi đó là "câu đố" nghèo nàn nếu bạn phải dựa vào hành vi không xác định để đạt được kết quả. Kiến thức như vậy không có giá trị gì, trừ khi bạn được bảo mật hệ thống một cách chuyên nghiệp. – DevSolar

Trả lời

0

Mã sau đây sẽ đạt được hiệu quả mong muốn.

#include<stdio.h> 
#include <stdlib.h> 

void change() 
{ 
printf("\nHow are you?"); 
exit(0); 
} 

int main() 
{ 
printf("\nHello"); 
change(); 
printf("\nHai"); 
printf("\nHow are you?"); 
return 0; 
} 

Mã này sẽ làm cho chương trình in "Hello", sau đó thực hiện hàm change() sẽ in "Bạn khoẻ không?" trên một dòng mới và sau đó thoát khỏi chương trình. Hàm exit() là một phần của thư viện chuẩn c có thể được nhìn thấy Here

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