2016-10-09 10 views
1

私はAleph Oneの "Fun and Profitのためのスタックを壊してしまった"と混乱していて、64ビットのコードをコンパイルしている間にスタックメモリは通常の "sub $ VALUE、%REG"を使って割り当てられません。Aleph Oneの記事で作業中に64ビットシステムでスタック割り当てが行われない

これは、関数のソースコードです:

void function() { 
    char buffer1[5]; 
    char buffer2[10]; 
    int *ret; 

    ret = buffer1 + 32; 
    (*ret) +=8; 
} 

そして、私はgccで-m32オプションを使用する場合、それが表示されている間、標準的なスタック割り当てがありませんなぜこれがコンパイルされたバージョン

function: 
.LFB0: 
.cfi_startproc 
pushq %rbp 
.cfi_def_cfa_offset 16 
.cfi_offset 6, -16 
movq %rsp, %rbp 
.cfi_def_cfa_register 6 
movl $1868654947, -16(%rbp) 
movb $0, -12(%rbp) 
leaq -16(%rbp), %rax 
addq $32, %rax 
movq %rax, -8(%rbp) 
movq -8(%rbp), %rax 
movl (%rax), %eax 
leal 8(%rax), %edx 
movq -8(%rbp), %rax 
movl %edx, (%rax) 
nop 
popq %rbp 
.cfi_def_cfa 7, 8 
ret 
.cfi_endproc 

です?

答えて

1

amd64 SysV ABIには、red zoneという概念が含まれています。赤いゾーンは、スタックポインタの直下の128バイトの領域です。これは、関数がスタックポインタを減分しながら少量のスタックを割り当てることを可能にすることを目的としています。そのため、スタックポインタが減少するのを見ることができません。

この機能をオフにするには、-mno-red-zoneとコンパイルしてください。

+0

ありがとうございました。 – last

+0

@last他の人があなたを助けたことを知っているように、回答を受け入れたものとしてマークすることを忘れないでください。 – fuz