#include <stdio.h>
int main(int argc, char** argv)
{
void (*p) (void);
/* this obviously won't work, but what string could I put in
here (if anything) to make this execute something meaningful?
Does any OS allow instructions to be read from
the stack rather than text area of the process image? */
char *c = "void f() { printf(\"Hello, world!\"); }";
p = (void (*)())c;
p();
return 0;
}
Trả lời
Chắc chắn điều đó là có thể. Buffer Overflow exploits sử dụng nó.
Xem Shellcode để biết loại chuỗi bạn có thể đặt.
Về cơ bản bạn có thể làm gì để đặt mã máy lên ngăn xếp và chuyển đến địa chỉ. Điều này sẽ gây ra việc thực hiện (nếu hệ điều hành/máy cho phép nó, xem NX bit).
Bạn thậm chí có thể cố gắng thực hiện một memcpy từ một số địa chỉ hàm vào một chuỗi trên ngăn xếp và sau đó thử nhảy đến địa chỉ trên ngăn xếp.
Sắp xếp, nhưng không thực sự, không có eval()
bằng c, như trong nhiều ngôn ngữ kịch bản.
Tuy nhiên, những gì bạn mô tả giống như một Buffer Overflow exploit.
Ở đâu, bạn sử dụng chuỗi để viết "mã" (không phải cú pháp c, nhưng mã máy) vào không gian địa chỉ sau bộ đệm. Đây là một chút đẹp tutorial của chủ đề.
Không sử dụng thông tin này để viết một virus :(
Có một 'eval()' loại: viết trình biên dịch C, biên dịch chuỗi thành mã máy, sau đó chạy nó. –
Cảm ơn, ý định của tôi là viết một chương trình tự sửa đổi trong khi thực hiện, có lẽ thậm chí không thể đoán trước được. Không có gì độc hại, chỉ là một bài tập học tập. – user389094
@ Chris: điểm tốt;) @rahul: Chắc chắn là một trải nghiệm học tập tốt, âm thanh vui nhộn :) – Stephen
Bạn có thể sử dụng libtcc
để biên dịch và chạy mã nguồn C:
const char *code = "int main(int argc, char**argv) { printf(\"Hello, world!\"); return 0; }";
TCCState *tcc = tcc_new();
if (tcc_compile_string(tcc, code))
{
// an error occurred compiling the string (syntax errors perhaps?)
}
int argc = 1;
char *argv[] = { "test" };
int result = tcc_run (tcc, argc, argv);
// result should be the return value of the compiled "main" function.
// be sure to delete the memory used by libtcc
tcc_delete(tcc);
Một coouple các vấn đề:
- Bạn chỉ có thể biên dịch
libtcc
trên kiến trúc được hỗ trợ. - Bạn cần có một
main
chức năng.
- 1. Mã hóa một chuỗi có ngăn xếp
- 2. Có thể di chuyển thực hiện của một đại biểu từ một chủ đề đến một thực thi khác không?
- 3. Có thể thực thi một chuỗi trong MySQL không?
- 4. là nó có thể thực thi mã javascript trong khuôn khổ .net?
- 5. Thực hiện một máy ảo dựa trên ngăn xếp cho một tập hợp con của C
- 6. Là một ngăn xếp giả nhanh hơn một chồng thực
- 7. chức năng glibc để lấy tên thực thi hiện tại?
- 8. Khả thi thực hiện chức năng đếm thủ công
- 9. Có thể thực hiện đối sánh chuỗi một phần trên khóa chuỗi từ điển không?
- 10. Hiển thị tên của chức năng hiện đang thực thi
- 11. Phantomjs không thực thi chức năng trong page.evaluate chức năng
- 12. Cách thực hiện chức năng thể dục
- 13. Nó được coi là hình thức xấu để thực hiện một chức năng trong một tuyên bố có điều kiện?
- 14. Làm thế nào để viết một wrapper trên chức năng và chức năng thành viên thực thi một số mã trước và sau khi các chức năng bọc?
- 15. C#: thực hiện một chức năng được lưu trữ trong một biến chuỗi
- 16. Thực hiện một chức năng từ gói sau khi thực hiện thư viện (pkg)
- 17. thực thi yêu cầu chức năng gọi
- 18. Thực thi chức năng Javascript cho một WebView từ một chương trình JavaFX
- 19. Có thể dừng thực thi chức năng trong một thời gian nhất định trong Java không?
- 20. thực hiện chức năng trên phím enter
- 21. Làm thế nào để bạn lý do về thứ tự thực hiện các chức năng trong một ngăn xếp monadT?
- 22. chức năng tự thực hiện
- 23. thực thi javascript chức năng từ html chọn
- 24. Một số tối ưu hóa rõ ràng cho một máy ảo thực hiện một ngôn ngữ chức năng là gì?
- 25. android runonuithread() chức năng không thực hiện
- 26. Thực thi một chức năng trên ứng dụng khởi động vòng/compjure sau khi triển khai
- 27. Thực thi mã prolog trên iPhone
- 28. Tôi có thể nhận tên/giá trị thông số theo thủ tục từ chức năng hiện đang thực thi không?
- 29. "Mở rộng" bảng "chuỗi" - cách thực hiện? Nó thậm chí là một ý tưởng tốt?
- 30. Từ khóa 'yield' có phải là một cú pháp không? Thực hiện của nó là gì
Cảm ơn bạn, bạn có thể giải thích một chút về cách tôi sẽ chuyển đến địa chỉ sau memcpy không? Và tôi sẽ ghi nhớ một đoạn bộ nhớ lớn như thế nào? Tôi có phải biết cách hàm được biểu diễn bằng ngôn ngữ assembly cho điều đó không? – user389094
Lưu ý rằng mặc dù chúng ta đang nói về việc chèn mã thực thi nhị phân ở đây - bạn không chỉ có khả năng tràn bộ đệm C và mong đợi bộ xử lý biết WTF bạn đang nói đến. –
@ rahulkumar42: Bạn có thể thử truyền địa chỉ chuỗi làm con trỏ hàm và thử gọi nó. Bạn không thực sự cần biết cách hàm được biểu diễn, máy sẽ thực hiện việc giải thích cho bạn. Kích thước để sao chép phụ thuộc vào chức năng bạn đang sao chép và có thể khó tìm hiểu. –