ASM cdecl-shellcode

Hallo,

Ich möchte mir der Performance wegen die eine oder andere Funktion in ASM schreiben. Meine ASM Kentnisse sind leider nicht sehr gross, aber gerade damit möchte ich mir etwas mehr erfahrung antrainieren.

Das ganze funktioniert so, dass ich den "shellcode" ins Memory schreibe und dann einen DLLCALL zur Adresse dieser Variabeln mache - mit den ganzen Parameter usw. Inline ASM sowie man es kennt, wird nicht unterstützt, daher dieser Weg.

Das funktioniert auch, nur weis ich nicht, wie ich die Parameter richtig übergeben muss. (Mangels Erfahrung in ASM)

Zunächst mal Ein Beispiel welches Funktioniert, da die Funktion nur einen Param zurückgibt (über das EAX Register) aber keine entgegen nimmt.
NASM CODE:
Code:
[SECTION .text]
BITS 32
global _start

_start:
  xor eax, eax
  CLD
  MOV ECX, 0xFF
  again:
    ADD, EAX, 0x02
  Loop again
ret
Daraus wird: "\x31\xc0\xfc\xb9\xff\x00\x00\x00\x05\x02\x00\x00\x00\xe2\xf9\xc3"

Rufe ich diesen "Shellcode/Inline Asm" in meinem Programm auf, gibt mir das dann auch 510 zurück. :)

Natürlich will ich auch Parameter übergeben, aber ich verstehe nicht recht wie das funktioniert - ich dachte ich könnte den Parameter einfach mit pop vom stack in ein register schreiben... aber das schein nicht zu funktionieren. Die Parameter liegen doch auf dem Stack bei cdecl?

Code:
[SECTION .text]
BITS 32
global _start

_start:
  xor EAX, EAX
  POP ECX
  CLD
  again:
    ADD EAX, 0x02
  Loop again
ret
Funktioniert leider nicht... (wollte das Zählerregister ECX mit dem Parameter befüllen)



Ich habe hier eine ASM Funktion gefunden, die den folgenden C Code abbildet:
C-CODE
Code:
void Bin2Hex0(UInt8 *hex, UInt8 *bin, UInt32 len) { // in hex room for 2*len+1 bytes 
    UInt8 c, d, *end = bin+len; 
    while (bin < end) { 
        c = *(bin++); 
        d = c >> 4; 
        *(hex++) = d + (d>9 ? 55 : 48); 
        d = c & 15; 
        *(hex++) = d + (d>9 ? 55 : 48); 
    } 
    *hex = 0; 
}
=>
ASM CODE
Code:
00000000  8B44240C          mov eax,[esp+0xc]
00000004  56                push esi
00000005  8B742408          mov esi,[esp+0x8]
00000009  57                push edi
0000000A  8B7C2410          mov edi,[esp+0x10]
0000000E  8D1407            lea edx,[edi+eax]
00000011  3BFA              cmp edi,edx
00000013  7332              jnc 0x47
00000015  53                push ebx
00000016  8A07              mov al,[edi]
00000018  47                inc edi
00000019  8AC8              mov cl,al
0000001B  C0E904            shr cl,0x4
0000001E  B309              mov bl,0x9
00000020  3AD9              cmp bl,cl
00000022  1ADB              sbb bl,bl
00000024  80E307            and bl,0x7
00000027  80C300            add bl,0x0
Welcher auch funktioniert, und die Parameter entgegen nimmt.


Kann mir mal jemand erklähren, wie ich eine cdecl Parameterübergabe richtig in ASM entgegennehme, und was ich beachten muss? Evtl Datentypen problem?

Desweiteren habe ich auch etwas verständnisprobleme warum z.B. hier:
Code:
mov eax,[esp+0xc]
direkt auf den Stack zugegriffen wird und nicht mittels pop die ganzen Params runtergeholt werden?

mfg
 
Zuletzt bearbeitet:
Das oberste DWORD auf dem Stack ist die Rücksprungadresse und nicht etwa der erste Parameter. Da darfst du nichts herauspoppen, sonst kann die Funktion nicht zurückkehren. Und da du cdecl benutzt, musst du dich nicht darum kümmern den Stack hinterher wieder von den Parametern freizuräumen.
Deinen ersten Parameter erreichst du direkt nach dem Aufruf also mit MOV %REG, [ESP+4].
 
Ich könnt mich würgen. Danke jetzt klappts natürlich :)

Code:
[SECTION .text]
BITS 32
global _start

_start:
  xor EAX, EAX
  MOV ECX, [ESP+4]
  CLD
  again:
    ADD EAX, 0x02
  Loop again
ret

thx
 
Zurück
Oben