Có thể thực hiện một quá trình có argc = 0 không? Tôi cần phải thực hiện một chương trình nhưng nó là vô cùng quan trọng đối với argc của nó bằng 0. Có cách nào để làm điều đó? Tôi đã cố gắng đặt 2^32 đối số trong dòng lệnh sao cho nó xuất hiện như thể argc = 0 nhưng có giới hạn tối đa đối với số đối số.thực hiện một quá trình với argc = 0
Trả lời
Bạn có thể viết chương trình gọi trực tiếp exec; cho phép bạn chỉ định các đối số dòng lệnh (bao gồm cả tên chương trình) và thiếu nó.
Bạn có thể viết một chương trình C mà spawns/giám đốc điều hành các chương trình khác không có argv, như:
#include <spawn.h>
#include <stdlib.h>
int main(int argc, char** argv, char** envp)
{
pid_t pid;
char* zero_argv[] = {NULL};
posix_spawn(&pid, "./that_app", NULL, NULL, zero_argv, envp);
int status;
waitpid(&pid, &status, NULL);
return 0;
}
Đây có phải là hành vi không xác định không? – user
@user: Không thực sự. Tiêu chuẩn xử lý 'argc' và' argv [0] == 0' như một tình huống hoàn toàn tốt đẹp. Xem [câu hỏi này] (http://stackoverflow.com/questions/2794150/when-can-argv0-have-null). –
Bạn có thể sử dụng hệ thống linux gọi execve().
int execve(const char *filename, char *const argv[], char *const envp[]);
Bạn có thể vượt qua filename của thực thi và một con trỏ null như các argv [] để thực thi nhị phân và argc sẽ bằng không.
Nó là mã thử nghiệm của tôi:
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[]={ NULL };
execv("./target", argv);
return (0);
}
Và strace kết quả là:
execve("./target", [], [/* 20 vars */]) = 0
Bạn có thể sử dụng envp [] để vượt qua các đối số bạn đã định nghĩa anyways.
Hơn nữa, bạn có thể sử dụng ngôn ngữ lắp ráp để đạt được mục tiêu của mình (argc == 0 nhưng bạn vẫn cần phải vượt qua đối số). Tôi cho rằng bạn đang sử dụng môi trường 32 bit x86.
Khái niệm này là:
- cửa hàng 0x0b ($ SYS_execve) vào % eax
- đặt địa chỉ của argv [] vào % ebx
- đặt địa chỉ của envp [] vào % ecx
- sau đó sử dụng int 0x80 để làm một cuộc gọi hệ thống
Cấu trúc bộ nhớ được hiển thị dưới đây:
+--------------------------------------------------+
| +----------------------------------|-----+
v v v------------------|-----|-----+
[arg_0][\0][...][arg_1][\0][...][arg_2][\0][...][ptr0][ptr1][ptr2][\0]
^
| (argv[] = NULL)
+--- envp
tôi tự hỏi rằng nếu bạn đang làm nhiệm vụ phòng thí nghiệm của khóa học được cung cấp bởi Giáo sư Taesoo Kim (GATECH) Liên kết khóa học: https://tc.gtisc.gatech.edu/cs6265
Hoặc là một sự cố CTF (cuộc thi bắt cờ) của hacker?
Điều này không cung cấp câu trả lời cho câu hỏi. Khi bạn có đủ [danh tiếng] (http://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bất kỳ bài đăng nào] (http://stackoverflow.com/help/privileges/comment); thay vào đó, [cung cấp câu trả lời không yêu cầu làm rõ từ người hỏi] (http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-thay thế). - [Từ đánh giá] (/ đánh giá/bài viết chất lượng thấp/15041212) –
Cố định, cảm ơn bạn. – vegafish
chính xác bạn đang cố gắng đạt được điều gì?Ý tôi là, có thể có một cách khác, đơn giản hơn để làm điều đó. – Aziz
Hệ điều hành của bạn là gì và bạn đang thực hiện quy trình này như thế nào? Có phải người dùng đã kích hoạt hoặc bạn đang gọi từ một quy trình khác không? – ibid
Bạn không thể đặt 'argc = 0' làm dòng đầu tiên của' main() '? –