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

Created Mon, 12 Dec 2022 00:00:00 +0000 Modified Thu, 16 Feb 2023 16:07:17 +0000
By Yoyo 772 Words 4 min Page views time 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 文件查看我们想要的信息了,其中会夹杂着很多的乱码,我们可以手动将乱码去除方便查看。