前言:学习笔记。(不是为了做题而做题,reverse和pwn都需要深入学习。)
常规思路: 下载 解压 查壳
32bit>>>32位 IDA Pro打开
常规:先查找字符串【东点西看】>>>再进入main函数【这题是winmain】>>>WIN32编程写的。
查找字符串
WinMain:
可疑参数:
跟进去看看
哎不想看,先直接看反。。。【截图不完。。直接和分析一起看吧。】
分析:
第一部分:
第二部分:
对于v7数组的范围:(这样看应该更简单些):【汇编中,连续的地址引用一般都是数组】
sub_4010F0(v7, 0, 10):(如何还原:C伪代码>>>C语言)>>>涨经验了。
关键点:类型确定[是char类型>>>【1】还是int类型【4】、数组寻址原理、C代码风格等等。。]
还原并运行:
#include <stdio.h>
#include <string.h>
#define _DWORD char
int __cdecl sub_4010F0(char * a1, int a2, int a3)
{
int result; // eax
int i; // esi
int v5; // ecx
int v6; // edx
result = a3;
for (i = a2; i <= a3; a2 = i)
{
v5 = i;
v6 = *(_DWORD *)(i + a1);
if (a2 < result && i < result)
{
do
{
if (v6 > *(_DWORD *)(a1 +result))
{
if (i >= result)
break;
++i;
*(_DWORD *)(v5 + a1) = *(_DWORD *)(a1 + result);
if (i >= result)
break;
while (*(_DWORD *)(a1 + i) <= v6)
{
if (++i >= result)
goto LABEL_13;
}
if (i >= result)
break;
v5 = i;
*(_DWORD *)(a1 + result) = *(_DWORD *)( i + a1);
}
--result;
} while (i < result);
}
LABEL_13:
*(_DWORD *)(a1 + result) = v6;
sub_4010F0(a1, a2, i - 1);
result = a3;
++i;
}
return result;
}
int main()
{
char v7[] = { 90,74,83,69,67,97,78,72,51,110,103,0};
sub_4010F0(v7, 0, 10);
printf("%s", v7);
return 0;
}
得到:
说明>>>
①sub_4010F0对v7进行了重新排序。
②v7 = "3CEHJNSZagn";【变形后的值】
第三部分:
第四部分:
大意:
当它条件全部成立且String长度为8[已知] >>>猜测 String= flag{}
v4 v5 加密后的值 是 ak1w 和V1Ax【在线解密就行 C实现挺困难的。。】
【猜测是base64,不知道就直接使用 随波逐流 >>>一键解码 0.0】
眼睛看得肉疼,直接写C脚本:
对比发现,只有base64中连续含有WP>>>说明base64加密猜测正确。
最终String结果顺序: