逆向攻防世界CTF系列1-Hello,CTF
逆向CTF系列1-Hello,CTF
下载文件首先查壳
是32位的。
上面的图看到了没有。说明这个软件是没有加壳的。是用Microsoft Visual C++ 6.0软件编写的。如果查到了是aspack的。那就说明是加了aspack的壳。您可以用专门脱aspack脱壳机来脱壳。很多高手都是用OllyDBG V1.10 手工来脱壳的。
可以先运行一下源程序,输入123,发现输出wrong
可能是要我们输出success才行。在ida中再看看,果断F5。
int __cdecl main(int argc, const char **argv, const char **envp) {
int i; // ebx
char v4; // al
int result; // eax
int v6; // [esp+0h] [ebp-70h]
int v7; // [esp+0h] [ebp-70h]
char Buffer[2]; // [esp+12h] [ebp-5Eh] BYREF
char v9[20]; // [esp+14h] [ebp-5Ch] BYREF
char v10[32]; // [esp+28h] [ebp-48h] BYREF
__int16 v11; // [esp+48h] [ebp-28h]
char v12; // [esp+4Ah] [ebp-26h]
char v13[36]; // [esp+4Ch] [ebp-24h] BYREF
strcpy(v13, "437261636b4d654a757374466f7246756e");
while ( 1 ){
memset(v10, 0, sizeof(v10));
v11 = 0;
v12 = 0;
sub_40134B(aPleaseInputYou, v6);
scanf("%s", v9);
if (strlen(v9) > 0x11 ) break;
for ( i = 0; i < 17; ++i ) {
v4 = v9[i];
if ( !v4 ) break;
sprintf(Buffer, "%x", v4);
strcat(v10, Buffer);
}
if (!strcmp(v10, v13)) sub_40134B(aSuccess, v7);
else sub_40134B(aWrong, v7);
}
sub_40134B(aWrong, v7);
result = --Stream._cnt;
if ( Stream._cnt < 0 )
return _filbuf(&Stream);
++Stream._ptr;
return result;
}
sub_40134B没搜到他的用途,但是读完代码并理解后可以假设一下他是输出函数,也就是,在v10和v13相等才会输出v13
简单讲一下代码逻辑,输入v9,v9长度不能大于0x11(0x11=17,16进制,因为0x),循环17次,取出每一位如果为0则退出循环,不为0则拼接到v10(16进制),循环结束后进行比较。
也就是437261636b4d654a757374466f7246756e是输入字符串的16进制
%x以十六进制数形式输出整数
当然也可以写脚本:
16
进制字符串转字符串,大致的逻辑就是将16
进制字符串每两个字符组合在一起得到一个16
进制的字符串
x='437261636b4d654a757374466f7246756e'
y=''
i=0
while(i < len(x)):
y += chr(int(x[i:i+2],16))
i += 2
print(y)
以下是 int() 方法的语法:
class int(x, base=10)
参数
- x – 字符串或数字。
- base – 进制数,默认十进制。
CrackMeJustForFun
成功,CrackMeJustForFun就是flag
补充一下壳的知识:
壳是指在一个程序外面包裹一段代码,保护里面的代码不被正确反编译或非法修改,在加载到内存时般先于程序运行,拿到控制权,然后保护并加载程序。
加壳:其实是利用特殊的算法,对EXE、DLL文件里的资源进行压缩。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。加壳过的程序可以直接运行但是不能查看源代码,要经过脱壳才可以查看源代码,这样可以起到保护程序的作用。
- 压缩壳:通过压缩算法压缩软件大小。
- 加密壳:利用各种反跟踪技术保护程序不被调试、脱壳、反编译。
- 感谢你赐予我前进的力量