初级题,100%应该不会有壳,先运行起来随便输入,看看报什么错误
搜一下x32dbg重新启动程序并搜索字符串
前面有一个je,前面还有一个cmp esi edi,在次下断点并运行,esi的值是6,edi的值是1B(27),显然不等,将je改为jne,继续运行
不停的向下跟,一个27次的循环结束后,flag会出现在ebp-40的地址里,后面会被复制给ECX
至此,flag已经找到了,复制输入,成功!
其实这个程序是先检查字符串长度是否为27,然后再将6b83537e8a30477b3e59362e4c293535340c5b5a5c797f5073747e进行计算,还原成答案,与输入进行比对,如果换成用输入反向计算去与目标字符串比对,难度无疑对新手不太友好。
flag是按位加算的,写成C代码逻辑如下
int main(int argc, char** argv)
{
unsigned char encFlag[] = {
0x6b, 0x83, 0x53, 0x7e, 0x8a, 0x30, 0x47, 0x7b
, 0x3e, 0x59, 0x36, 0x2e, 0x4c, 0x29, 0x35, 0x35
, 0x34, 0x0c, 0x5b, 0x5a, 0x5c, 0x79, 0x7f, 0x50
, 0x73, 0x74, 0x7e
};
unsigned char flag[28] = { 0 };
int edx = 0x7e9;//2025
int v90 = 0x80000000;
for (int i = 0; i < 27; i++)
{
int eax = (0x41C64E6D * edx + 0x1E240) % (int)v90;
edx = eax;
long long tmp = (long long)eax * 0x4ec4ec4f;
eax = (tmp >> 32) & 0xFFFFFFFF;
eax = eax >> 3;
eax = ((eax + ((unsigned int)eax >> 0x1F)) & 0xff) * 0x1A;
flag[i] = encFlag[i] + ((eax & 0xFF) - (edx & 0xFF)) & 0xFF;
}
printf("%s\n", flag);
}