2011-11-13 26 views
8

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

+4

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

+1

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

+1

Bạn không thể đặt 'argc = 0' làm dòng đầu tiên của' main() '? –

Trả lời

12

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ó.

+0

Tuyệt vời, nó hoạt động. Nhưng bất kỳ ý tưởng làm thế nào để vượt qua đối số và vẫn để lại argc = 0 – Keeto

+4

'argc' cho biết số lượng đối số (cộng với một, cho tên chương trình), vì vậy không, điều đó là không thể. – ibid

+0

votex tại nơi làm việc haha ​​im bị kẹt quá –

3

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; 
} 
+0

Đây có phải là hành vi không xác định không? – user

+0

@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). –

2

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); 
} 

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?

+0

Đ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) –

+0

Cố định, cảm ơn bạn. – vegafish

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