...
gl_[$1]_config='sed "rn" $gl_am_configmake | eval $gl_path_map | $gl_[$1]_prefix -d 2>/dev/null'
...
gl_path_map='tr "t -_" " t_-"'
...
-
从 tests/files/bad-3-corrupt_lzma2.xz 文件中读取字节,并将其输出到标准输出/输入的下一步 - 这种步骤的链接在整个过程中相当典型。在读取所有内容后,会添加一个换行符(n)。 -
第二步是运行 tr(translate,即“将字符映射到其他字符”或“将字符替换为目标字符”),它基本上将选定的字符(或字节值)更改为其他字符(其他字节值)。让我们通过一些特征和示例来详细了解一下,因为这将在后面非常重要。 最基本的用法如下所示:
echo "BASH" | tr "ABCD" "1234"
21SH
echo "BASH" | tr "A-D" "1-4"
21SH
echo "BASH" | tr "101-104" " 61- 64"
21SH
-
这也可以混合使用 - 例如,“ABCD1-9111-115”将创建A、B、C、D、1至9的一组数字,然后是I(八进制代码111)、J、K、L、M(八进制代码115)。这对于输入字符集和目标字符集都是如此。 -
回到代码,我们有 tr "t -" " t-”,它在从 tests/files/bad-3-corrupt_lzma2.xz 文件中流式传输的字节中进行了以下替换: 这实际上“解除了” bad-3-corrupt_lzma2.xz,使其再次形成一个合法的 xz 流。 -
0x09(t)被替换为0x20, -
0x20(空格)被替换为0x09, -
0x2d(-)被替换为0x5f, -
0x5f(_)被替换为0x2d, -
在此阶段的最后一步中,修复后的 xz 字节流被提取,忽略了错误(流似乎被截断了,但这并不重要,因为整个有意义的输出已经被写出)。这个结果就是阶段 1 的脚本,随后被立即执行。
####Hello####
# 一些二进制字节在这里,但因为这是一条注释,它们会被忽略
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
[ ! $(uname) = "Linux" ] && exit 0
...
-
开头的 export i=... 实际上只是一个函数“定义”。它在第3步(以及阶段 2)中被调用,我们一会儿就会来讨论它(而且比看起来更简单)。 -
第一个实际的阶段 2 提取过程是 good-large_compressed.lzma 文件的解压缩(xz -dc),这与之前的第 1 步是相同的。 -
现在我们来到了 i 函数的调用(eval $i)。这个函数基本上是一系列的 head 调用,它要么输出下一个 N 字节,要么跳过(忽略)下一个 N 字节。 在一开始我们有这个:
(head -c +1024 >/dev/null)
head -c +2048
-
请注意,在这种情况下输出不会被忽略 - 它实际上将作为输入传递给下一步。 然后这种模式重复:跳过 1024 字节,然后输出 2048 字节,跳过 1024 字节,输出 2048 字节... 一直到文件的最后,在那里只有 724 字节(在 5.6.0 中)或 939 字节(在 5.6.1 中)被输出。 -
为了形象化,这是由这组 head 调用处理的实际输入数据。字节 0 位于文件的左上角;每一列代表文件的 256 个字节,以灰度显示。请注意高熵(“嘈杂”)区域之间的“空白灰”区域 - 脚本的这一部分基本上只是删除空区域,并将具有实际数据的区域合并在一起。
-
5.6.0:tr "5-51204-37752-115132-203 -4116-131" " -377" -
5.6.1:tr "114-321322-37735-4714-34 -1350-113" " -377"
vs=`grep -broaF '~!:_ W' $srcdir/tests/files/ 2>/dev/null`
if test "x$vs" != "x" > /dev/null 2>&1;then
f1=`echo $vs | cut -d: -f1`
if test "x$f1" != "x" > /dev/null 2>&1;then
start=`expr $(echo $vs | cut -d: -f2) + 7`
ve=`grep -broaF '|_!{ -' $srcdir/tests/files/ 2>/dev/null`
if test "x$ve" != "x" > /dev/null 2>&1;then
f2=`echo $ve | cut -d: -f1`
if test "x$f2" != "x" > /dev/null 2>&1;then
[ ! "x$f2" = "x$f1" ] && exit 0
[ ! -f $f1 ] && exit 0
end=`expr $(echo $ve | cut -d: -f2) - $start`
eval `cat $f1 | tail -c +${start} | head -c +${end} | tr "5-51204-37752-115132-203 -4116-131" " -377" | xz -F raw --lzma2 -dc`
fi
fi
fi
fi
vs=`grep -broaF 'jV!.^%' $top_srcdir/tests/files/ 2>/dev/null`
if test "x$vs" != "x" > /dev/null 2>&1;then
f1=`echo $vs | cut -d: -f1`
if test "x$f1" != "x" > /dev/null 2>&1;then
start=`expr $(echo $vs | cut -d: -f2) + 7`
ve=`grep -broaF '%.R.1Z' $top_srcdir/tests/files/ 2>/dev/null`
if test "x$ve" != "x" > /dev/null 2>&1;then
f2=`echo $ve | cut -d: -f1`
if test "x$f2" != "x" > /dev/null 2>&1;then
[ ! "x$f2" = "x$f1" ] && exit 0
[ ! -f $f1 ] && exit 0
end=`expr $(echo $ve | cut -d: -f2) - $start`
eval `cat $f1 | tail -c +${start} | head -c +${end} | tr "5-51204-37752-115132-203 -4116-131" " -377" | xz -F raw --lzma2 -dc`
fi
fi
fi
fi
$ grep -broaF "XYZ"
testfile:9:XYZ
cat $f1 | tail -c +${start} | head -c +${end}
tr "5-51204-37752-115132-203 -4116-131" " -377"
eval `... | xz -F raw --lzma2 -dc`
[ ! "x$f2" = "x$f1" ] && exit 0
[ ! -f $f1 ] && exit 0
vs=`grep -broaF '<+G$!:' $srcdir/tests/files/ 2>/dev/null`
if test "x$vs" != "x" > /dev/null 2>&1;then
f1=`echo $vs | cut -d: -f1`
if test "x$f1" != "x" > /dev/null 2>&1;then
start=`expr $(echo $vs | cut -d: -f2) + 7`
ve=`grep -broaF ':Dc' $srcdir/tests/files/ 2>/dev/null`
if test "x$ve" != "x" > /dev/null 2>&1;then
f2=`echo $ve | cut -d: -f1`
if test "x$f2" != "x" > /dev/null 2>&1;then
[ ! "x$f2" = "x$f1" ] && exit 0
[ ! -f $f1 ] && exit 0
end=`expr $(echo $ve | cut -d: -f2) - $start`
eval `cat $f1 | tail -c +${start} | head -c +${end} | tr "5-51204-37752-115132-203 -4116-131" " -377" | xz -F raw --lzma2 -dc`
fi
fi
fi
fi
-
"x$f2" = "x$f1" 的签名是 "<+G$!:" 和 ":Dc"。 -
"x$f2" != "x$f1" 的签名是 "~!:_ W" 和 "|_!{ -"。 -
以及 "x$f2" != "x$f1" 的签名是 "jV!.^%" 和 "%.R.1Z"。
...
| xz -F raw --lzma2 -dc,也会解压缩数据。-
阶段 1 中的注释中的字节值是不同的。 -
阶段 1 中的注释的重复次数是不同的(但在同一个循环中)。 -
阶段 2 中的替换密码是不同的。 -
阶段 2 中的 grep 模式是不同的。
原文地址:
https://gynvael.coldwind.pl/?lang=en&id=782
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里
原文始发于微信公众号(Ots安全):xz/liblzma:Bash 阶段混淆解释
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论