guten abend allerseits. wieder etwas, wo ich nicht weiterkomme und so nicht direkt etwas im netz gefunden habe.
ich habe folgendes einfache programm (aus "buffer-overflows ..." von tobias klein, dpunkt-verlag) mit dem gcc mit der option -S kompiliert, welches eigentlich nur die funktionsweise des stacks erläutern soll:
der gcc in der version 4.0.2 gibt mir nun folgendes:
es geht jetzt erstmal insbesondere um main(). die ersten drei zeilen (pushl, movl, subl) sind eigentlich klar, auch wenn ich net verstehe, warum da statt 4 byte für int 24 reserviert werden, aber egal. aber was danach kommt verstehe ich überhaupt nicht. warum wird auf die adresse im esp bitweises and mit -16 gemacht? und dann auch die sachen movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax und sall $4, %eax überhaupt nicht nachvollziehbar irgendwie .. ich meine ich weiß, was die assembler-befehle im einzelnen bedeuten, aber sehe im moment da keinen sinn drin. warum wird das ganze nicht einfach ausgelassen, so dass direkt nach dem reservieren des benötigten speichers in der 3. zeile einfach mit dem kopieren der parameter für die funktion() weitergemacht wird (also hier mit pushl $3)? weiß jemand eine antwort oder evtl. auch ne url, wo auf dieses thema näher eingegangen wird? das wäre klasse. ich danke euch.
grüße,
alpha.
ich habe folgendes einfache programm (aus "buffer-overflows ..." von tobias klein, dpunkt-verlag) mit dem gcc mit der option -S kompiliert, welches eigentlich nur die funktionsweise des stacks erläutern soll:
Code:
void funktion(int a, int b, int c)
{
int buff1[5];
char buff2[10];
buff1[0]='6';
buff2[0]='A';
buff2[1]='B';
}
int main(void)
{
int i=1;
funktion(1,2,3);
return 0;
}
der gcc in der version 4.0.2 gibt mir nun folgendes:
Code:
.file "funk_normal.c"
.text
.globl funktion
.type funktion, @function
funktion:
pushl %ebp
movl %esp, %ebp
subl $32, %esp
movl $54, -20(%ebp)
movb $65, -30(%ebp)
movb $66, -29(%ebp)
leave
ret
.size funktion, .-funktion
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
subl %eax, %esp
movl $1, -4(%ebp)
pushl $3
pushl $2
pushl $1
call funktion
addl $12, %esp
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.0.2 20050821 (prerelease) (Debian 4.0.1-6)"
.section .note.GNU-stack,"",@progbits
es geht jetzt erstmal insbesondere um main(). die ersten drei zeilen (pushl, movl, subl) sind eigentlich klar, auch wenn ich net verstehe, warum da statt 4 byte für int 24 reserviert werden, aber egal. aber was danach kommt verstehe ich überhaupt nicht. warum wird auf die adresse im esp bitweises and mit -16 gemacht? und dann auch die sachen movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax und sall $4, %eax überhaupt nicht nachvollziehbar irgendwie .. ich meine ich weiß, was die assembler-befehle im einzelnen bedeuten, aber sehe im moment da keinen sinn drin. warum wird das ganze nicht einfach ausgelassen, so dass direkt nach dem reservieren des benötigten speichers in der 3. zeile einfach mit dem kopieren der parameter für die funktion() weitergemacht wird (also hier mit pushl $3)? weiß jemand eine antwort oder evtl. auch ne url, wo auf dieses thema näher eingegangen wird? das wäre klasse. ich danke euch.
grüße,
alpha.