Einen kleinen Execve-Shellcode neu schreiben

Durchgehenhttp://hackoftheday.securitytube.net/2013/04/demystifying-execve-shellcode-stack.html

Ich habe das aufgerufene nasm-Programm verstandenexecve und versuchte es neu zu schreiben.

Einige Hintergrundinformationen:

int execve(const char *filename, char *const argv[], char *const envp[]);

So,eax = 11 (Funktionsrufnummer fürexecve),ebx sollte zeigen aufchar* filename, ecx sollte zeigen aufargv[] (das wird das gleiche sein wieebx da ist das erste argument das*filename selbst z.B. "/ bin / sh" in diesem Fall) undedx wird zeigen aufenvp[] (null in diesem Fall).

Ursprünglicher nasm code:

global _start

section .text
_start:

xor eax, eax
push eax

; PUSH //bin/sh in reverse i.e. hs/nib//

push 0x68732f6e
push 0x69622f2f

mov ebx, esp

push eax
mov edx, esp

push ebx
mov ecx, esp

mov al, 11
int 0x80

Der Stack sieht wie folgt aus:

Jetzt habe ich versucht, dies zu optimieren, indem ich einige Anweisungen reduzierte. Ich bin damit einverstanden, bismov ebx, esp Der Code bleibt gleich. Seitdem jedochecx muss zeigen aufebxIch kann den Code wie folgt umschreiben:

global _start

section .text
_start:

xor eax, eax
push eax

; PUSH //bin/sh in reverse i.e. hs/nib//

push 0x68732f6e
push 0x69622f2f
mov ebx, esp

mov ecx,ebx

push eax
mov edx, esp

mov al, 11
int 0x80

Ich erhalte jedoch einen Segmentierungsfehler, wenn ich meinen neu geschriebenen Code ausführe.

Mein Stack ist wie folgt:

Irgendwelche Ideen, warum der neu geschriebene Code nicht funktioniert? Ich habe auch gdb ausgeführt und die Adresswerte entsprechen meinen Vorstellungen, aber es wird einfach nicht ausgeführt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage