逆向CTF系列1-Hello,CTF

下载文件首先查壳

image-20241011170415935

是32位的。

上面的图看到了没有。说明这个软件是没有加壳的。是用Microsoft Visual C++ 6.0软件编写的。如果查到了是aspack的。那就说明是加了aspack的壳。您可以用专门脱aspack脱壳机来脱壳。很多高手都是用OllyDBG V1.10 手工来脱壳的。

可以先运行一下源程序,输入123,发现输出wrong

image-20241011213951422

可能是要我们输出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以十六进制数形式输出整数

image-20241011220112125

当然也可以写脚本:

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

image-20241011220412699

补充一下壳的知识:

壳是指在一个程序外面包裹一段代码,保护里面的代码不被正确反编译或非法修改,在加载到内存时般先于程序运行,拿到控制权,然后保护并加载程序。

加壳:其实是利用特殊的算法,对EXE、DLL文件里的资源进行压缩。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。加壳过的程序可以直接运行但是不能查看源代码,要经过脱壳才可以查看源代码,这样可以起到保护程序的作用。

image-20241011171006197

  • 压缩壳:通过压缩算法压缩软件大小。
  • 加密壳:利用各种反跟踪技术保护程序不被调试、脱壳、反编译。