标签:i++ pre 过程 代码 静态 搜索字符串 int com 结果
首先拿到一个exe执行程序,无壳,我们先运行一下,发现只要输入结果后就会退出,那看来是我们输入的不正确就会退出
由于是exe程序,所以我首先进行的是debug动态调试,因为有输入就会有与正确密码的对比,所以我先看看它的正确密码有没有进行加密算法加密
动态调试:
我们看到有right,有pause,所以这个上面肯定有对比,然后我们可以在这个上面函数入口处下断,经过调试发现,这里的密码是被算法加密过的,所以无法直接看到。
进去主函数,是上图的这段代码,那么经过我的分析,我红色框部分是一个关键的部分,其实这段代码是一个逆序运算,下面会将我们输入的内容与放到这段寄存器中的内容进行对比,对比的结果直接影响到是跳到right还是退出程序,所以我们就需要好好看一下这段代码。这段代码的意思就是逆序,将一段内容给逆序了一下,所以这段实际上就是flag的逆序。这里我们可以看lea esi,dword ptr ss:[ebp+ecx-0x25] 这一行,这一行就是执行逆序之前的重要点,所以这个地址里存放的数据我们给取出来,然后进行逆序,得到flag。接下来我来说一下静态分析的方法。
我知道大多数人用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("\n");
return 0;
}
运行结果:
得到flag。
标签:i++ pre 过程 代码 静态 搜索字符串 int com 结果
原文地址:https://www.cnblogs.com/Jleixin/p/13040238.html