Вы можете использовать системный вызов linux execve () .
int execve(const char *filename, char *const argv[], char *const envp[]);
Вы можете передать имя файла исполняемого файла и нулевой указатель как argv [] , чтобы выполнить двоичный файл, и argc будет равен нулю. *
Это мой тестовый код:
#include <stdio.h>
#include <unistd.h>
int main( void ) {
char *argv[]={ NULL };
execv( "./target", argv );
return ( 0 );
}
И результат strace :
execve("./target", [], [/* 20 vars */]) = 0
Вы можете использовать envp [] для передачи аргументов, которые вы определили в любом случае.
Кроме того, вы можете использовать язык ассемблера для достижения своей цели (argc == 0, но вам все равно нужно передавать аргументы). Я предполагаю, что вы используете 32-битную среду x86.
Концепция такова:
- сохранить 0x0b ($ SYS_execve) в % eax
- введите адрес argv [] в % ebx
- введите адрес envp [] в % ecx
- затем используйте int 0x80 , чтобы сделать системный вызов
Структура памяти показана ниже:
+--------------------------------------------------+
| +----------------------------------|-----+
v v v------------------|-----|-----+
[arg_0][\0][...][arg_1][\0][...][arg_2][\0][...][ptr0][ptr1][ptr2][\0]
^
| (argv[] = NULL)
+--- envp
Мне интересно, если бы вы выполняли лабораторное задание по курсу, предложенному профессором Таесоо Ким (GATech).
Ссылка на курс: https://tc.gtisc.gatech.edu/cs6265
Или это проблема хакерского CTF (состязания под флагом)?