zoukankan      html  css  js  c++  java
  • 第一个反汇编程序

    程序结构分析

    1、找关键词(jum call 寄存器值)

    2、分析密码对比

    步骤:

    load ------>run------>输入Name:A/9@BcdeGmnRsU'{, Serial:123456789---->点regieste------.>暂停-------->查看stack(点K)-------->进入---------.>找到类似于“you entered an incorrect serial, try again...”字符串----->查看前后的call和jup(特别留什么每一处)

    分析此图:

    红色处为关键call je为关键条,为什么?

    前面有两个push 刚才输入的名字和序号,后面紧跟着这个call,说明这个call是用来验证输入的名字和序号的正确性的。Call后面有一个or eax eax ; je short 00401288;。。。如果相等的话就会跳到那条注册失败的验证信息上去(je 00401288;),否则就不会发生跳转,直接进入注册正确的信息()。。。。

    进入关键call分析 (在此处按回车就好)

    进入Call之后如图停在push ebp上,下面还有move add push push push后面还有call后又跟着mov push 然后在call。我们还需要在进入Call

    进入Call之后还是push move 再push ......当执行完loads short 0040146B 之后ESI 和EDI 寄存器内存发生变化成为我们输入的用户名:A/9@BcdeGmnRsU'{,这很关键,说明程序开始对我们输入的信息进行加工了,下面的内容肯定就是如何对我们的信息加工的。

    此处的信息加工

    1、0 -~9 a~z A~Z之间的存下,其他的字符过滤掉

    2、dl 中存下有效字符的个数

    lods byte ptr [esi]

    inc dl

    3、小写字母改大写(sub al 20;)

    余下的代码就是为Call返回做准备工作了

    pop edi ; pop esi; pop edx; pop ebx; leave ; retn ;

    Call 返回的时候就回到mov ebx ,eax;

    下面还有一个Call ,可以猜测:那个Call是对我们输入的序号进行处理的。

    F7单步步入,进入Call里:如下图

    进入Call之后前面还是push ..。。。。

    F7 到那一些J* 后就是对我们的序号进行处理的过程了,我看到地址和上次处理用户名的地址一样的,可以推测出来这个对我们的序号进行了和处理用户名时一样的操作:

    1、0 ~ 9 a ~ z A ~ Z之间的存下,其他的字符过滤掉

    2、dl 中存下有效字符的个数

    lods byte ptr [esi]

    inc dl

    3、小写字母改大写(sub al 20;)

    退出Call 回到这里: 如图

    看到那条cmp eax, ebx; 指令了吗?下面还有Jnz short 00401354;这个跳转是根据eax与ebx是否相等进行跳转的,若不相等就跳到00401354处

    我们不知道他是干什么的,那么我们就一步步的来试试吧,F7 一直按 。。。。额,改返回了,返回到里这了,上图看:

    我们返回到我们第一次找找到关键跳的Call下的一条Or eax, eax;指令上面。

    这个说明了,系统已经验证结束了并且给我们的验证作出了判断:假的!

    仅仅差几个地址就会跳到正确的注册信息那地方那个去了,他偏偏跳过去了。

    为什么会这样呢?

    回到那个Call里在重新自习看一遍,这也就说明了,那个我们看不懂的Call是

    对我们的注册信息作出了否定。。。Fuck。。。灰心了吗???

    灰心你就被打败了!!!!

    仔细看看那个Call 的三个功能,怎么还有一个没有用到呢?就是那个判断有效字符个数的。

    我考,不会是用户名字符个数和序号密码个数不一致就会被BAN了吧?最简单的办法就是试试设置成一样的位数,用户名不该了,改序号为:123456789012。

    再重新来一遍试试,那个该死的Cmp eax, ebx;终于能相等了,原来eax,ebx存放的是有效字符串的个数。

    咱们们在一步一步的来往下走:jnz 没有跳,or eax, je 无法跳;or ebx; jnz 跳到了0040135e;到现在为止已经成功过了那个返回注册错误的雷区。一改进入下一步的注册信息比较了。

    F7 一直往下。。。。

    这一些都是对序号一些处理和写注册机有关,我搞不懂,没能写出算法来实现。当你执行完搜有的处理后你会惊奇的发现在内存区004033DB开始的位置在每次循环完成后都会往这里写数据,你应该明白了,这就是根据你的用户名,程序算出来的你的序号。。中奖了,直接粘贴出来,测试一下,恩,成功的看到了正确的注册信息了。

    小结:

    简单分析一下此处程序Call的固定格式

    Push ebp;

    mov ebp, esp;

    add esp , -8; sub esp ,10;//抬高栈顶

    push edx;

    Push esi ;

    Push edi;

    。。。。

    。。。。。

    。。。。

    Pop edi;

    Pop esi;

    Pop edx;

    Pop ebx;

    测试数据

    用户名:A/9@BcdeGmnRsU'{

    获得注册码

    ASCII:34 39 42 37 44 31 30 33 35 32 39 38

    HEX :49B7D1035298

    此文结束/

  • 相关阅读:
    洛谷 1850 NOIP2016提高组 换教室
    2018牛客多校第三场 C.Shuffle Cards
    2018牛客多校第一场 B.Symmetric Matrix
    2018牛客多校第一场 A.Monotonic Matrix
    2018牛客多校第一场 D.Two Graphs
    2018宁夏邀请赛L Continuous Intervals
    2018宁夏邀请赛K Vertex Covers
    BZOJ
    HDU
    ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)
  • 原文地址:https://www.cnblogs.com/ppazhang/p/2841587.html
Copyright © 2011-2022 走看看