Tag: 红区

在处理Aleph One文章时,64位系统上没有堆栈分配

我一直在搞乱来自Aleph One的“Smash the stack for Fun and Profit”,并发现在为我的64位处理器编译代码时,堆栈内存不能使用通常的“sub $ VALUE,% REG“。 这是函数源代码: void function() { char buffer1[5]; char buffer2[10]; int *ret; ret = buffer1 + 32; (*ret) +=8; } 这是编译版本 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 […]

为什么在这个函数序言中没有“sub rsp”指令,为什么函数参数存储在负rbp偏移量?

这就是我通过阅读一些内存分段文档所理解的:当一个函数被调用时,有一些指令(称为函数序言)将帧指针保存在堆栈上,将堆栈指针的值复制到基指针中并保存一些局部变量的内存。 这是我尝试使用GDB调试的一个简单代码: void test_function(int a, int b, int c, int d) { int flag; char buffer[10]; flag = 31337; buffer[0] = ‘A’; } int main() { test_function(1, 2, 3, 4); } 调试此代码的目的是了解调用函数时堆栈中发生的情况:因此我必须在执行程序的各个步骤(在调用函数之前和执行期间)检查内存。 虽然我通过检查基指针设法看到返回地址和保存的帧指针之类的东西,但我真的无法理解在反汇编代码之后我要写的内容。 拆解: (gdb) disassemble main Dump of assembler code for function main: 0x0000000000400509 : push rbp 0x000000000040050a : mov rbp,rsp 0x000000000040050d : mov […]

内联assembly破坏了红色区域

我正在编写一个加密程序,并且核心(一个广泛的乘法例程)是用x86-64汇编编写的,既速度又因为它广泛使用了不容易从C访问的adc指令。我不想内联这个函数,因为它很大,并且在内循环中被调用了好几次。 理想情况下,我还想为此函数定义一个自定义调用约定,因为在内部它使用所有寄存器( rsp除外),不破坏其参数,并在寄存器中返回。 现在,它适应了C调用约定,但当然这使它变慢(大约10%)。 为了避免这种情况,我可以用asm(“call %Pn” : … : my_function… : “cc”, all the registers);调用它asm(“call %Pn” : … : my_function… : “cc”, all the registers); 但有没有办法告诉GCC调用指令与堆栈混淆? 否则GCC会将所有这些寄存器放在红色区域中,而顶部的寄存器将被破坏。 我可以使用-mno-red-zone编译整个模块,但我更喜欢告诉GCC,比方说,红色区域的前8个字节将被破坏,以便它不会放任何东西。