柚子/使用核心转储来解密使用shc加密的脚本

Created Mon, 12 Dec 2022 00:00:00 +0000 Modified Thu, 05 Dec 2024 15:59:00 +0000
By Yoyo 714 Words 3 min Edit

背景

最近看到一段用 shc 加密后的脚本,
浅读了一下加密混淆后生成的 c 语言代码,
发现脚本的内容是被编码在 data 中

data

并通过 xsh(int argc, char ** argv) 函数来解密,
然后通过 execvp(shll, varg); 函数来执行脚本

uTools\_1670840491088.png
屏幕截图 2022-12-12 181851.png

那么!
我们就可以通过 hook execvp 函数来获取加密前的脚本!

如果你有加密前的 c 文件的话,
可以直接修改代码,
重写一个 execvp(shll, varg); 函数来直接获取脚本内容,
下面的文章你可以不用看了

使用核心转储获取脚本(以下命令全部需要 Root 权限)

然后由于我只是想获取该脚本中的几个常量的值,
所以我并没有使用 hook 的方式,
而是使用更加简单的核心转储

Hook 的方式后面再写一篇博文吧

1、将 core dump 文件的限制设置为无限制

首先我们先将 core dump 文件的限制设置为无限制。
这样,
如果程序终止,
就可以产生任意大小的 core dump 文件。

ulimit -c unlimited

2、设置 core dump 文件的保存路径和文件名

然后我们设置 Linux 系统内核产生的 core dump 文件的保存路径和文件名。

echo "/tmp/core_dump/%e-%p-%t.core" > /proc/sys/kernel/core_pattern

/tmp/core_dump/ 是要将 core dump 文件保存到的目录,
%e、%p%t 分别表示产生 core dump 文件的程序的名字、
进程 ID 和时间戳。
例如,
如果一个名为 my_program 的程序运行时产生了一个 core dump 文件,
该文件的名字可能会是 my_program-12345-1623456789.core
其中 12345 是进程 ID,1623456789 是时间戳。

3、创建目录

接着我们创建 /tmp/core_dump/ 目录。

mkdir /tmp/core_dump/

4、执行加密后的脚本,获取 core dump 文件

接着,
我们要执行一下被加密后的脚本,
然后等它启动后向它发送一个 SIGSEGV 信号,
该信号表示程序执行了无效的内存访问操作。

./xxx.sh.x & (sleep 0.01 && kill -SIGSEGV $!)

此时会输出类似
[1]+ Segmentation fault (core dumped)...
这样的提示,
我们回去看我们创建的 /tmp/core_dump/ 目录里面,
应该就能看到我们想要的 core dump 文件了。

5、查看 core dump 文件,获取想要的信息

到这里,我们就可以打开 core dump 文件查看我们想要的信息了,其中会夹杂着很多的乱码,我们可以手动将乱码去除方便查看。