zoukankan      html  css  js  c++  java
  • csaw2013reversing2 writeup

    csaw2013reversing2 writeup

    1、程序分析

    题目是一个exe文件,提示运行即可拿到flag,但是窗口弹出之后会出现一堆乱码。这时候,我们把文件丢入IDA之中,看到程序大致流程如下。

     主函数如图所示,流程比较简单,进入sub_40100看一下,我们看到sub_40100函数是一个加密函数。

    还有一个函数sub_40102A如图所示:

    2、IsDebuggerPresent函数与int 3中断

     进入函数的时候,会有一个判断,sub_401020函数和IsDebuggerPresent函数返回值有一个不为零的时候,就会执行sub_401000函数,否则,就会跳过函数,直接执行后面的窗口函数。

    分析程序,我们看到sub_401020的返回值恒为0。关于IsDebuggerPresent函数,文档上给出说明如下:

     

     就是说,如果程序在调试状态下运行的话,返回值不为0,如果不在调试状态下运行,返回值就为0。程序运行时,他的返回值一定是0,所以程序直接执行了后面的窗口函数而没有执行加密函数。

    在OD中打开程序,我们会看到一个指令:int 3。int 3是一个调试中断,这条指令可以使CPU中断到调试器。

    2、修改指令

    到这里,我们应该明白,要不显示乱码,就要改写程序数据流走向,让程序执行sub_401000这个加密函数。一开始可能会想直接改写sub_40102A的返回值,但是这个是有问题的,汇编代码eax清零的时候,会用xor eax,eax,这条指令只占用2个字节,但是mov eax,1的话,要占用5个字节。

    所以,我们应该控制的,是几条跳转指令:

    1、是if判断结束后的那一条跳转指令,我们让程序执行跳转函数,将jz short 002710EF改写为jmp short 00271096;

    2、执行完加密函数之后,我们去执行窗口函数,jmp short 002710EF修改为jmp short 002710B9。

    执行,就可以得到flag。

  • 相关阅读:
    3.1按钮
    2.1线性布局
    2.2相对布局
    1.4Activity保存现场状态
    1.1Activity跳转与传值
    1.2Activity返回值
    1.3Activity生命周期
    WebSocket
    Jms消费者模式
    课堂实践5-31
  • 原文地址:https://www.cnblogs.com/L0g4n-blog/p/13331114.html
Copyright © 2011-2022 走看看