算法分析方法,算法分析是什么
1.下载并检查外壳
64位无外壳
2.拖动到IDA中进行具体分析
(1)shift F12查找键字符串。
关键字符串“很好!”被发现了。根据经验,这是验证成功后的提示。
(2)找到引用关键字符的函数。
(3)看代码就知道流程了:要求用户输入一个字符串,存储在S中,S的地址作为参数传递给sub_4006FD,sub_4006FD的返回值是调用sub_4006FD函数的if判断条件。如果返回值不为零,会提示“密码不正确!”,所以让sub_4006FD的返回值为0。
(4)跟进sub_4006FD功能
看代码可知,只有满足for中的if条件才会返回非零1,但我们要的是返回,所以要让if条件在这11个循环中失败,就要检查条件。
(char)(v3[I % 3]2(I/3))-(char *)(I a1)!=1
每个周期v3对应的数组的值加2 (i/3)作为地址,取地址的值。
每次减去(i a1)地址的值,判断减法的结果是否为1。如果不是1,就继续循环。如果是1,它将返回1。然后我们必须让它在11次后循环回0。仔细看这里的a1,这是我们输入进出main函数的字符串的地址值。所以重点是,我们的目的是如果条件成立就写。
(char)(v3[I % 3]2(I/3))-(char)(I a1)==1
对应于如此计算的地址的(i a1)的值是正确的值。
然后直接写剧本。
#包括
int main()
{
int I;//[RSP 14h][RBP-24h]int n=0;_ _ int 64 v3[4];//[RSP 18h][RBP-20h]int a1[11]={ 1 };v3[0]=(_ _ int 64) Dufhbmf ;v3[1]=(_ _ int 64)“pg ` imos”;v3[2]=(_ _ int 64) ewUglpt ;for(I=0;i=11I){ for(size _ t n=0;n 222n){ if(*(char *)(v3[I % 3]2 *(I/3))-n==1)a1[I]=n;} } for(size _ t I=0;i i ){ printf(%c ,a1[I]);}}
变量n定义为我们输入的每个字符对应的ASCLL码值,n的最大ASCLL码值设置为200。通过不断判断(char)(v3[i% 3] 2 (i/3))-n==1,将符合条件的n存放在我们正确的标志数组中。
3.结果
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。