Assembly 利用堆栈重定向逻辑流
我试图修改rip,将代码流重定向到一个名为“win”的函数。然而,许多尝试都失败了 以下是代码、反汇编和系统规范: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()
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中尝试您的漏洞,这样您就可以看到它是如何出错的<代码>开始printf 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x6d\x51\x55\x55\x55\x55\x00\x00' |
./TheOver AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQUUUU
Segmentation fault