zoukankan      html  css  js  c++  java
  • EasyRE

    0x01

    首先拿到一个exe执行程序,无壳,我们先运行一下,发现只要输入结果后就会退出,那看来是我们输入的不正确就会退出

    由于是exe程序,所以我首先进行的是debug动态调试,因为有输入就会有与正确密码的对比,所以我先看看它的正确密码有没有进行加密算法加密

    0x02

    动态调试:

    一、搜索字符串

    我们看到有right,有pause,所以这个上面肯定有对比,然后我们可以在这个上面函数入口处下断,经过调试发现,这里的密码是被算法加密过的,所以无法直接看到。

    二、跟进函数

    进去主函数,是上图的这段代码,那么经过我的分析,我红色框部分是一个关键的部分,其实这段代码是一个逆序运算,下面会将我们输入的内容与放到这段寄存器中的内容进行对比,对比的结果直接影响到是跳到right还是退出程序,所以我们就需要好好看一下这段代码。这段代码的意思就是逆序,将一段内容给逆序了一下,所以这段实际上就是flag的逆序。这里我们可以看lea esi,dword ptr ss:[ebp+ecx-0x25] 这一行,这一行就是执行逆序之前的重要点,所以这个地址里存放的数据我们给取出来,然后进行逆序,得到flag。接下来我来说一下静态分析的方法。

    0x03

    我知道大多数人用ida进行分析的时候,肯定第一步就喜欢用F5,这里,其实如果这里直接F5,我们会错过在动态调试中看到的逆序算法,所以这道题考察我们的是汇编功底。所以,有时候我们会被ida“欺骗”,学会变通,学会把ida当工具而不是一键F5

    这个图中我标了3个箭头,第一个箭头是说这段是关键代码,第二个箭头是说这个就是它进行逆序的算法程序,最后一个箭头是将输入值与一个值进行对比的过程。(但是这个值不是flag,因为我已经试过)

    然后我们再F5写一下,看一下主函数的执行过程

    箭头所指为对比的地方,我们双击过去看看

    它就是把我框框里的东西进行了它那个函数中的算法,所以这里,我们给它逆运算一下,下面是我编写的脚本:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    
    int main()
    {
    
    	char a[100] = { 0x78, 0x49, 0x72, 0x43, 0x6A, 0x7E, 0x3C, 0x72, 0x7C, 0x32, 0x74, 0x57, 0x73, 0x76, 0x33, 0x50, 0x74, 0x49, 0x7F, 0x7A, 0x6E, 0x64, 0x6B, 0x61 };
    	char flag[25] = { 0 };
    	for (int i = 0; i < 24; i++)
    	{
    		flag[i] += (a[23 - i] ^ 0x6) - 0x1;
    	}
    	printf("%s", flag);
    	printf("
    ");
    	return 0;
    }
    

    运行结果:

    得到flag。

  • 相关阅读:
    二叉查找树
    huffman coding
    普通树与二叉树
    递归转循环的通法
    尾递归和JAVA
    编译器和解释器
    开天辟地-用visualstudio2010编写helloworld
    Android app targetSdk升级到27碰到的一个bug补充说明
    Android Studio修改Apk打包生成名称
    Glide3升级到Glide4碰到的问题汇总以及部分代码修改
  • 原文地址:https://www.cnblogs.com/Jleixin/p/13040238.html
Copyright © 2011-2022 走看看