攻防世界逆向-hello CTF
无聊的exe文件,不过main函数很清晰,没有被隐藏
想尝试将奇怪的一串数字化为字符串而得到flag,未果,转换完还是这样子的
那么我们只能悲催的继续分析伪代码,看不懂就硬看
memcpy(&v22, "437261636b4d654a757374466f7246756e", 0x20u);
v23 = *(_WORD *)"6e";
v24 = a437261636b4d65[34];
while ( 1 )
{memset(&v19, 0, 0x20u);
v20 = 0;
v21 = 0;
sub_40134B("please input your serial:", v15);
scanf("%s", v18);
if ( strlen(v18) > 0x11 )
break;
v3 = 0;
do
{
v4 = v18[v3];
if ( !v4 )
break;
sprintf(&Dest, "%x", v4);
v5 = &Dest;
v6 = -1;
do
{
v4 = v18[v3];
if ( !v4 )
break;
sprintf(&Dest, "%x", v4);
v5 = &Dest;
v6 = -1;
do
{
if ( !v6 )
break;
v7 = *v5++ == 0;
--v6;
}
while ( !v7 );
v8 = ~v6;
v9 = &v5[-v8];
v10 = v8;
v11 = &v19;
v12 = -1;
do
{
if ( !v12 )
break;
v7 = *v11++ == 0;
--v12;
}
while ( !v7 );
v13 = v11 - 1;
memcpy(v13, v9, 4 * (v10 >> 2));
++v3;
memcpy((char *)v13 + 4 * (v10 >> 2), (char *)v9 + 4 * (v10 >> 2), v10 & 3);
}
while ( v3 < 17 );
if ( strcmp(&v19, &v22) )
sub_40134B("wrong!\n", v15);
else
sub_40134B("success!\n", v15);
}
sub_40134B("wrong!\n", v16);
result = File._cnt-- - 1;
if ( File._cnt < 0 )
result = _filbuf(&File);
else
++File._ptr;
return result;
}
于是我尝试读懂这串奇怪的数字
memcpy(&v22, "437261636b4d654a757374466f7246756e", 0x20u);
memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。
所以v22的地址里面存的值就是这串奇怪的数字
很巧,在输出flag成功或者失败的时候,有v22和v19比较,这函数我也不懂,所以一定要多记住啊,这就是书到用时方恨少的感觉吧,我搜函数意思的时候可能人家就拿了一血了。。
strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
输入的东西传入了v18
scanf()是C语言中的一个输出函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include <stdio.h>。)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
所以是输入不能超过17位,不然程序就退出了
437261636b4d654a757374466f7246756e
观察这串奇怪的数字,我坚信他一定是flag的导火线,发现是由数字和字母组成的,且最大字母是e,十六进制里面最大字母是f,所以我有一种直觉,这是一串十六进制转换到字符串就能得到flag
使用在线十六进制到文本字符串的转换器
当当!得到flag了,这应该是zui简单的题了吧,我做的很开心,希望比赛也是这种题,让大家都拿一下分,别跟强x杯似的,出的题都死难死难的,直接放弃了。
附上:十六进制是怎么转成字符串的,因为16进制对应的字符的ASCII码都是两位两位的,所以可以从一个大长串数字转换为字符串。