逆向工程实验Pre5

赞赏码 & 联系方式 & 个人闲话

逆向工程前言

Pre5

1、阅读PE文件格式全接触

https://bbs.pediy.com/thread-22892.htm

可移植的可执行文件格式:

作者对整个PE文件格式进行了完整的解释,还有所有必须的结构体的描述以及如何使用这个信息的源代码实例。通读全文,我们可以知道:PE文件的全部格式包括---一个MS-DOS的MZ头、后面跟着一个实模式的根程序、PE文件签名、PE文件头、PE可选头、所有的节头、最后就是所有的节身。作者同样使用了大篇幅去阐释一种类型的PE文件PEFILE.DLL及其函数描述,从PEFILE.DLL的动态链接库中导出的简单便捷的函数,可以增强我们在编写PE文件时的可读性。

 

2、阅读 reflector实现看.net的混淆与反混淆技术

https://www.pediy.com/kssd/pediy08/pediy8-523.htm

reflector实现看.net的混淆与反混淆技术

文章主要介绍的混淆方式都来自reflector,目标是基于reflector的混淆来进行反混淆。reflector的保护源文件的方式有:使用不可见名作名称混淆、主功能文件隐藏发现程序入口困难等等。作者将reflector用到的混淆技术除名称混淆外分为两类,一类是防止反编译的混淆,另一类是防止重编译的混淆。针对这些混淆的反编译,作者提出了反混淆时目标高级语言的选择以及抓住反混淆的关键掉尤为重要。反编译成可编译的高级语言后利用高级语言编译器的优化功能处理混淆,反编译如果出错,人工修改和调试也是必不可少的。

 

3、(选做)What does the following code do?

代码注释如下:

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)

 

4、root:$1$abcde$LULigrJwcdszq2ReOX7bG/:15933:0:99999:7:::

(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

你可能感兴趣的:(逆向工程)