Передача аргументов в execve (2) через регистры - PullRequest
0 голосов
/ 10 октября 2019

Я написал короткую программу для выполнения bash, используя execve(2).

my_prog.c

int main(){
    execve(Argument_1,Argument_2,NULL);
}

Вот разборка execve(2) [пренебрегая основной сборкой дляпростота]

(gdb) disassemble execve
Dump of assembler code for function execve:
   0xf7ea77e0 <+0>:     push   ebx
   0xf7ea77e1 <+1>:     mov    edx,DWORD PTR [esp+0x10]
   0xf7ea77e5 <+5>:     mov    ecx,DWORD PTR [esp+0xc]
   0xf7ea77e9 <+9>:     mov    ebx,DWORD PTR [esp+0x8]
   0xf7ea77ed <+13>:    mov    eax,0xb
   0xf7ea77f2 <+18>:    call   DWORD PTR gs:0x10
   0xf7ea77f9 <+25>:    pop    ebx
   0xf7ea77fa <+26>:    cmp    eax,0xfffff001
   0xf7ea77ff <+31>:    jae    0xf7e0f730
   0xf7ea7805 <+37>:    ret

Я нашел аргументы для execv(2) в следующих регистрах

eax --> index of execve(2) in syscall table
ebx --> Argument_2
ecx --> Argument_3

и Argument_1 на вершине стека

(gdb) x/xw $esp
0xffffce00:     0x080484ea
(gdb) x/s 0x080484ea
0x80484ea:      "/bin/bash"  <--- Argument_1

edx содержит 0x080484ab

(gdb) x/xw 0x080484ab
0x80484ab <__libc_csu_init+75>: 0x8301c783
(gdb) x/xw 0x8301c783
0x8301c783:     Cannot access memory at address 0x8301c783

Я нахожусь в системе linux-intel (x86), поэтому я предполагаю, что все параметры для execve (2) должны быть переданы через регистры, но я не смог найтиАргумент_1 в любом регистре , хотя он присутствует в стеке.

1 Ответ

1 голос
/ 11 октября 2019

Я остановился на первой инструкции модуля execve.

execve - это не "модуль", это функция libc, которая загружает аргументы в регистры,и затем выполняет фактический системный вызов.

я не смог найти Argument_1 ни в одном регистре

Если вы остановились на инструкции по адресу 0xf7ea77f2, вы будет .

Но вы остановлены при входе в функцию C execve, поэтому аргументы - это то, где функция C ожидает их. На i*86 аргументы передаются в стеке, поэтому вы найдете их здесь: x/3wx $esp - это то, что вы хотите (на тот момент в программе).

...