修改堆栈上的返回地址

fli*_*liX 7 c assembly stack buffer-overflow

我查看了缓冲区溢出漏洞的基础知识,并尝试了解堆栈的工作原理.为此,我想编写一个简单的程序,将返回地址的地址更改为某个值.任何人都可以帮我弄清楚基本指针的大小以获得第一个参数的偏移量吗?

void foo(void)
{
    char ret;
    char *ptr;

    ptr = &ret; //add some offset value here 
    *ptr = 0x00;
}

int main(int argc, char **argv)
{
    foo();

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

生成的汇编程序代码如下所示:

    .file   "test.c"
    .text
    .globl  foo 
    .type   foo, @function
foo:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16 
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    leaq    -9(%rbp), %rax
    movq    %rax, -8(%rbp)
    movq    -8(%rbp), %rax
    movb    $0, (%rax)
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret 
    .cfi_endproc
.LFE0:
    .size   foo, .-foo
    .globl  main
    .type   main, @function
main:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16 
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp
    movl    %edi, -4(%rbp)
    movq    %rsi, -16(%rbp)
    call    foo 
    movl    $1, %eax
    leave
    .cfi_def_cfa 7, 8
    ret 
    .cfi_endproc
.LFE1:
    .size   main, .-main
    .ident  "GCC: (GNU) 4.7.1 20120721 (prerelease)"
    .section    .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)

foo框架段的相关部分应如下所示:

[char ret] [基地指针] [返回地址]

我有第一个的位置,只有1个字节的大小.在http://insecure.org/stf/smashstack.html中提到的基本指针或单词大小只有1个字节吗?我怎样才能知道基指针的大小?

Cla*_*dix 0

看来您正在使用 64 位架构,因为 RBP 和 RSP 寄存器是 64 位长。如果您声明ptr为,则char*必须将其递增 8 次才能在堆栈中移动。相反,您可以将其声明为uint64_t *. 此数据类型通常在<stdint.h>.

然而,堆栈帧定义会根据目标体系结构甚至编译器行为和优化而有所不同。不过,如果你正在尝试,那也很好。