EasyRE
Posted jleixin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()
{
const char* a = "xIrCj~<r|2twsv3PtIzndka";
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。
以上是关于EasyRE的主要内容,如果未能解决你的问题,请参考以下文章
攻防世界 Reverse高手进阶区 2分题 easyre-153