这题有点抽象,动态调试断点总是下不对,只能静态做了v7那里原本是v7[2],可以看到是一片连续的内存,所以直接修改数组长度为11会好看很多,由于不会动态调试,甚至都搞不清楚那里是输入,看到input那里有一个比较长度的操作,于是判断他是输入,下面一个函数 sub_7210F0(v7, 0, 10);传入的v7,代码很长,但是可以从最后面看出这是对v7进行了更改(将函数的第一个参数改为int数组即可),直接复制伪代码,
#include<stdio.h>
sub_5210F0(int a1[], int a2, int a3);
int main()
{
int a1[11]={90,74,83,69,67,97,78,72,51,110,103};
int result; // eax
int i; // esi
int v5; // ecx
int v6; // edx
int a2=0;
int a3=10;
result = a3;
result = a3;
for ( i = a2; i <= a3; a2 = i )
{
v5 = i;
v6 = a1[i];
if ( a2 < result && i < result )
{
do
{
if ( v6 > a1[result] )
{
if ( i >= result )
break;
++i;
a1[v5] = a1[result];
if ( i >= result )
break;
while ( a1[i] <= v6 )
{
if ( ++i >= result )
goto LABEL_13;
}
if ( i >= result )
break;
v5 = i;
a1[result] = a1[i];
}
--result;
}
while ( i < result );
}
LABEL_13:
a1[result] = v6;
sub_5210F0(a1, a2, i - 1);
result = a3;
++i;
}
for(int j=0;j<11;j++)
{
printf("%c",a1[j]);
}
return 0;
}
sub_5210F0(int a1[], int a2, int a3)
{
int result; // eax
int i; // esi
int v5; // ecx
int v6; // edx
result = a3;
result = a3;
for ( i = a2; i <= a3; a2 = i )
{
v5 = i;
v6 = a1[i];
if ( a2 < result && i < result )
{
do
{
if ( v6 > a1[result] )
{
if ( i >= result )
break;
++i;
a1[v5] = a1[result];
if ( i >= result )
break;
while ( a1[i] <= v6 )
{
if ( ++i >= result )
goto LABEL_13;
}
if ( i >= result )
break;
v5 = i;
a1[result] = a1[i];
}
--result;
}
while ( i < result );
}
LABEL_13:
a1[result] = v6;
sub_5210F0(a1, a2, i - 1);
result = a3;
++i;
}
}
运行结果是3CEHJNSZagn,也就是新的v7。
然后这里是怎么判断出是base64操作的呢?我是看了一眼就直接gpt了然后事后诸葛亮一下
查看这个数组发现是个字符表,就是base64的默认数据,再结合下面的对比查看这个数组发现是个字符表,就是base64的默认数据,再结合下面的对比V9的长度为3,而比较的字符串长度却是4,这也很容易想到是base64编码。然后根据if里的判断可以得出输入的前四个值为UJWP,下面两个字符串进行base64解码
得到UJWP1jMp。
大佬们能讲讲这题动态调试为啥不得行吗 ^^