https://bbs.pediy.com/thread-22892.htm
可移植的可执行文件格式:
作者对整个PE文件格式进行了完整的解释,还有所有必须的结构体的描述以及如何使用这个信息的源代码实例。通读全文,我们可以知道:PE文件的全部格式包括---一个MS-DOS的MZ头、后面跟着一个实模式的根程序、PE文件签名、PE文件头、PE可选头、所有的节头、最后就是所有的节身。作者同样使用了大篇幅去阐释一种类型的PE文件PEFILE.DLL及其函数描述,从PEFILE.DLL的动态链接库中导出的简单便捷的函数,可以增强我们在编写PE文件时的可读性。
https://www.pediy.com/kssd/pediy08/pediy8-523.htm
从reflector实现看.net的混淆与反混淆技术
文章主要介绍的混淆方式都来自reflector,目标是基于reflector的混淆来进行反混淆。reflector的保护源文件的方式有:使用不可见名作名称混淆、主功能文件隐藏发现程序入口困难等等。作者将reflector用到的混淆技术除名称混淆外分为两类,一类是防止反编译的混淆,另一类是防止重编译的混淆。针对这些混淆的反编译,作者提出了反混淆时目标高级语言的选择以及抓住反混淆的关键掉尤为重要。反编译成可编译的高级语言后利用高级语言编译器的优化功能处理混淆,反编译如果出错,人工修改和调试也是必不可少的。
代码注释如下:
csc .NET compiler (MSVS 2010), ildasm output
.method public hidebysig static uint8 f(uint8 a) cil managed
{
// Code size 36 (0x24)
.maxstack 2 //计算堆栈能存2个值
.locals init (uint8 V_0)
IL_0000: nop //空操作
IL_0001: ldarg.0 //将this指针压入栈
IL_0002: conv.u8 //将位于计算堆栈顶部的值转换为 unsigned int64,然后将其扩展为 int64。
IL_0003: ldc.i8 0x202020202 //0x202020202放到计算堆栈上
IL_000c: mul //算堆栈最顶上两个数的乘积 a×0x202020202,并把结果入栈
IL_000d: ldc.i8 0x10884422010 //0x10884422010放到计算堆栈上
IL_0016: and //算堆栈最顶上两个数的与,并把结果入栈
IL_0017: ldc.i4 0x3ff //0x3ff放到计算堆栈上
IL_001c: conv.i8 //将位于计算堆栈顶部的值转换为 int64
IL_001d: rem //将两个值相除并将余数推送到计算堆栈上
IL_001e: conv.u1 //将位于计算堆栈顶部的值转换为 unsigned int8,然后将其扩展为 int32。
IL_001f: stloc.0 //从计算堆栈的顶部弹出当前值并将其存储到索引 0 处的局部变量列表中。
IL_0020: br.s IL_0022 //无条件地将控制转移到目标指令
IL_0022: ldloc.0 //把调用堆栈0处的值复制到计算堆栈
IL_0023: ret //return
} // end of method e25::f
代码功能:
输出值为输入值沿中间翻转。
比如:
输入 | 输出 |
---|---|
1 (0000 0001) | 128 (1000 0000) |
2 (0000 0010) | 64 (0100 0000) |
3 (0000 0011) | 192 (1100 0000) |
(hint:密码长度不超过6)
查阅资料,我们可以知道Ubuntu中密码的存储格式。我们可以看到root后面跟了一串字符串并且被 : 分割其中第一部分就是加密后的密码。其它部分分别表示最后改密码的日期,最小密码寿命,最大密码寿命等等。
而对于$1$abcde$LULigrJwcdszq2ReOX7bG/。加密后的密码可以分为三段来看,被 $ 分割。其中第一段就是表明散列算法的类型,第二段是系统为我们密码添加的盐值(salt),最后第三段才是映射完的散列值。
用户名 |
算法 |
盐值 |
消息摘要 |
root |
1 |
abcde |
LULigrJwcdszq2ReOX7bG/ |
那么我们可以编写代码,遍历每种字符的组合可能来暴力破解,要说明的是crypt是Linux下专有库,也就是说代码只能再Linux环境下运行:
代码如下:
#!usr/bin/python
# -*- coding: utf-8 -*-
import crypt
temp='0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
for i1 in temp:
for i2 in temp:
for i3 in temp:
for i4 in temp:
for i5 in temp:
for i6 in temp:
if '$1$abcde$LULigrJwcdszq2ReOX7bG/'==crypt.crypt(i1+i2+i3+i4+i5+i6,"$1$abcde"):
print('we found it '+i1+i2+i3+i4+i5+i6)
exit()
运行结果:
运行时间很长,不过最终还是解密出来了,root账户密码是:123qwe