sách gpt4 ai đã đi

Có thể thực thi một mảng số như một hàm không?

In lại Tác giả: Space Dog Thời gian cập nhật: 2023-10-29 11:38:40 27 4
mua khóa gpt4 Nike

Nói tóm lại, tôi có một mảng các số nguyên biểu diễn phần .text của tệp nhị phân ELF với một hàm. Tôi muốn thực hiện chức năng này. Tôi đã chạy lệnh này trước khi thử thực hiện lệnh:

mprotect(hàm, sHeader.sh_size, PROT_EXEC | PROT_READ | PROT_WRITE);

Nghĩ rằng nó có thể khắc phục được sự cố về quyền, nhưng nó vẫn bị lỗi phân đoạn khi tôi thử chạy:

int (*fp)(int, int) = (int (*)(int, int))getFunc("đến");
số nguyên a = 2;
số nguyên b = 3;
cout << fp(a, b) << "\n";

Nhưng nó vẫn bị lỗi phân đoạn khi tôi thử chạy nó:

Chương trình nhận được tín hiệu SIGSEGV, Lỗi phân đoạn.
0x0000000000603010 trong ?? ()

Tôi có bỏ lỡ điều gì không?

objdump của hàm tôi đang cố gắng thực thi:

0000000000000000 :
nhân():
0:55 đẩy %rbp
1: 48 89 e5 di chuyển %rsp,%rbp
4: 89 7ngày fc mov %edi,-0x4(%rbp)
7: 89 75 f8 di chuyển %esi,-0x8(%rbp)
a: 8b 45 fc mov -0x4(%rbp),%eax
d: 0f af 45 f8 imul -0x8(%rbp),%eax
11: 5ngày pop %rbp
12: c3 trả về

1 Câu trả lời

cài đặtYêu tinhTệp đích chứa sự di dờithông tin, có khả năng là .chữphần này chứa mã cần di dời, do đó mã sẽ không chạy theo nguyên trạng. sử dụng objdumpđọclệnh để khám phá nó. Nếu bạn thực sự muốn tải theo cách bạn đang làm, bạn nên xử lý thông tin di dời, vốn phức tạp, phụ thuộc vào bộ xử lý và rất tẻ nhạt. Nếu bạn thực sự muốn dành một vài tuần để làm điều này, hãy nghiên cứu x86-64 ABI . Nhưng sử dụng đổ dốccủa .Vì thếSau đódlsymĐơn giản hơn (vì đổ dốc Trong việc có mmap Sau khi di dời - từ t.vậy ), xem bên dưới.

ABI x86-64 đã từng http://x86-64.org/documentation/abi.pdf Nhưng trang web đó hiện không hoạt động

Là gì lấyFunc ? Làm thế nào để bạn di chuyển trong ĐẾN ? Tại sao bạn không thể có một cái? t.vậyCác đối tượng được chia sẻ (chẳng hạn như sử dụng gcc -Wall -fPIC -O -shared tc -o t.so Biên dịch) và sau đó sử dụng dlopen(3) Tải nó và dlsym(3)Ví dụ

typedef int hàmig_t (int, int);
void* dlh = dlopen("./t.so", RTLD_NOW);
nếu (!dlh) {
fprintf(stderr, "dlopen t.so không thành công với %s\n", dlerror());
thoát(THOÁT_THẤT_CẦN);
};
chức năngig_t* fp = (functionsig_t*) dlsym(dlh, "myfunc");
nếu (!fp) {
fprintf(stderr, "dlsym myfunc không thành công với %s\n", dlerror());
thoát(EXIT_FAILURE),
}
// bây giờ bạn có thể gọi fp
int res = (*fp) (1,2);

một lầnfpTrở về và không tồn tại t.vậy Trong khung ngăn xếp cuộc gọi của bất kỳ hàm nào bạn có thểdlclose(dlh);Điều này sẽ bản đồ munTừ t.vậy Bạn có thể tránh gọi điện dlđóng (Điều này thường dẫn đến rò rỉ nhỏ không gian địa chỉ của quy trình; xem tài liệu /proc/1234/bản đồ để tìm hiểu về quy trình với pid 1234), đặc biệt là nếu bạn không đổ dốcSố lượng lớn các đối tượng được chia sẻ.

nếu nhưt.vậyPlugin gọi một hàm từ chương trình chính của bạn, mà bạn muốn giao tiếp với -rdynamic Liên kếtđã Tùy chọn hoặc gcc

nếu nhưt.vậyđã được biên dịch từ một số mã nguồn C++, mã này sẽ khai báo

 bên ngoài "C" int myfunc(int,int);

bởi vìtên làm sai lệchPhụ thuộc vào g++ Hoàn thành

của tôi nhiềudl.cChương trình cho thấy bạn có thể thực hiện hàng trăm ngàn lầnđổ dốc -s Trong các tiến trình Linux. Nó thực hiện điều này bằng cách tạo mã C "ngẫu nhiên" và biên dịch nó thành một số .Vì thế Hãy đến làm việc. , Và đổ dốc -cái đó.Vì thếtập tin, sau đó lặp lại nhiều lần.

Nếu bạn không muốn biên dịch .c gánh nặng hoặc .ccĐược mã hóa như .Vì thếCác plugin bạn có thể cân nhắc sử dụng LLVM Tạo mã ngay lập tức trong bộ nhớ, asmjit , thư viện , GNU sétvân vân……

Có thể thực thi một mảng số như một hàm không? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/14291381/

27 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com