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