Я написал короткую программу для выполнения 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 в любом регистре , хотя он присутствует в стеке.