背景
最近看到一段用 shc 加密后的脚本,
浅读了一下加密混淆后生成的 c 语言代码,
发现脚本的内容是被编码在 data 中
并通过 xsh(int argc, char ** argv)
函数来解密,
然后通过 execvp(shll, varg);
函数来执行脚本
那么!
我们就可以通过 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 文件查看我们想要的信息了,其中会夹杂着很多的乱码,我们可以手动将乱码去除方便查看。