C 指令被垃圾覆盖?

C 指令被垃圾覆盖?,c,x86,overwrite,exploit,instructions,C,X86,Overwrite,Exploit,Instructions,我正在练习一个函数返回地址覆盖漏洞。但是,程序指令指针会被乱码覆盖。我曾经尝试过使用-fno-builtin和-fno-stack-protector进行编译,但似乎没有任何改变 代码(摘自《黑客利用的艺术》,第2版,第125页): 此地址将在“授权访问”的开头输入。请参见下面的反汇编(位于0x56556297:添加esp,0x4): 0x5655627e <+57>: push eax 0x5655627f <+58>: call 0x5

我正在练习一个函数返回地址覆盖漏洞。但是,程序指令指针会被乱码覆盖。我曾经尝试过使用
-fno-builtin
-fno-stack-protector
进行编译,但似乎没有任何改变

代码(摘自《黑客利用的艺术》,第2版,第125页):

此地址将在“授权访问”的开头输入。请参见下面的反汇编(位于
0x56556297:添加esp,0x4
):

   0x5655627e <+57>:    push   eax
   0x5655627f <+58>:    call   0x565561d9 <check_authentication>
   0x56556284 <+63>:    add    esp,0x4
   0x56556287 <+66>:    test   eax,eax
   0x56556289 <+68>:    je     0x565562ba <main+117>
   0x5655628b <+70>:    lea    eax,[ebx-0x1fd1]
   0x56556291 <+76>:    push   eax
   0x56556292 <+77>:    call   0x56556060 <puts@plt>
   0x56556297 <+82>:    add    esp,0x4
   0x5655629a <+85>:    lea    eax,[ebx-0x1fb4]
   0x565562a0 <+91>:    push   eax
   0x565562a1 <+92>:    call   0x56556060 <puts@plt>
   0x565562a6 <+97>:    add    esp,0x4
   0x565562a9 <+100>:   lea    eax,[ebx-0x1f9e]
   0x565562af <+106>:   push   eax
   0x565562b0 <+107>:   call   0x56556060 <puts@plt>
字符串复制后的堆栈:

(gdb) next
9       strcpy(password_buffer, password);
(gdb) x/12x $esp
0xffffd190: 0x00000002  0xffffd264  0xffffd270  0x565562fd
0xffffd1a0: 0x00000000  0x56559000  0xffffd1b8  0x56556284
0xffffd1b0: 0xffffd429  0x00000000  0x00000000  0xf7dd6e46
(gdb) 
(gdb) next
11      if(strcmp(password_buffer, "brillig") == 0)
(gdb) x/12x $esp
0xffffd190: 0x56556297  0x56556297  0x56556297  0x56556297
0xffffd1a0: 0x56556297  0x56556297  0x56556297  0x56556297
0xffffd1b0: 0xffffd400  0x00000000  0x00000000  0xf7dd6e46
(gdb) 
。。。以及带回溯和指令指针值的崩溃

(gdb) cont
Continuing.

    Program received signal SIGSEGV, Segmentation fault.
    0xfdabe850 in ?? ()
    (gdb) bt
    #0  0xfdabe850 in ?? ()
    #1  0x565562a6 in main (argc=-1159180033, argv=0x83fffffd)
        at auth_overflow2.c:26
    Backtrace stopped: previous frame inner to this frame (corrupt stack?)
    (gdb) i r $eip
    eip            0xfdabe850          0xfdabe850
    (gdb) 
“eip”的这个值从何而来?是否有一些高级Linux保护我没有(或不能)关闭

我正在运行:

tester@Test:/$ uname -a
Linux Test 5.10.0-kali3-amd64 #1 SMP Debian 5.10.13-1kali1 (2021-02-08) x86_64 GNU/Linux

我是在64位系统上做的。在这里,您可以使用该函数为堆栈[子rsp,0x20]分配32字节的空间,所有变量都存储在堆栈[子rsp,0x20]中,然后您需要额外的8字节内存rip。因此,为了覆盖指令指针,您需要首先填充最初的32个字节,然后给出您要去的地方的地址
rip中正好插入了两个'A'。顺便说一句,如果您正在学习,那么我建议您使用它,它会创建非常简单的输出,您可以在汇编中轻松理解。

单步执行调试器中的代码(
si
命令,请先尝试
display/i$eip
),然后看看您是如何做到这一点的。
(gdb) cont
Continuing.

    Program received signal SIGSEGV, Segmentation fault.
    0xfdabe850 in ?? ()
    (gdb) bt
    #0  0xfdabe850 in ?? ()
    #1  0x565562a6 in main (argc=-1159180033, argv=0x83fffffd)
        at auth_overflow2.c:26
    Backtrace stopped: previous frame inner to this frame (corrupt stack?)
    (gdb) i r $eip
    eip            0xfdabe850          0xfdabe850
    (gdb) 
tester@Test:/$ uname -a
Linux Test 5.10.0-kali3-amd64 #1 SMP Debian 5.10.13-1kali1 (2021-02-08) x86_64 GNU/Linux