• Jarvis OJ


    Jarvis OJ - Baby's Crack - Writeup


    解压是一个.exe 文件 一个.enc文件
    这个.enc文件用wireshark打不开,用记事本打开,是一串疑似加密后的字符
    下载后解压有exe和flag.enc两个文件,初步推测flag.enc是用exe加密后的文件 .enc文件可以用来存放加密后的数据
    而且根据主要函数推断,里面多次出现打开文件,文件读写操作

    int __cdecl main(int argc, const char **argv, const char **envp)
    {
      int result; // eax
      char Dest; // [rsp+20h] [rbp-80h]
      FILE *v5; // [rsp+88h] [rbp-18h]
      FILE *File; // [rsp+90h] [rbp-10h]
      char v7; // [rsp+9Fh] [rbp-1h]
      int v8; // [rsp+B0h] [rbp+10h]
      const char **v9; // [rsp+B8h] [rbp+18h]
    
      v8 = argc;
      v9 = argv;
      _main();
      if ( v8 <= 1 )
      {
        printf("Usage: %s [FileName]
    ", *v9);
        printf(aFilename);
        exit(1);
      }
      File = fopen(v9[1], "rb+");
      if ( File )
      {
        v5 = fopen("tmp", "wb+");
        while ( feof(File) == 0 )
        {
          v7 = fgetc(File);
          if ( v7 != -1 && v7 )
          {
            if ( v7 > 47 && v7 <= 96 )
            {
              v7 += 53;
            }
            else if ( v7 <= 46 )
            {
              v7 += v7 % 11;
            }
            else
            {
              v7 = 61 * (v7 / 61);
            }
            fputc(v7, v5);
          }
        }
        fclose(v5);
        fclose(File);
        sprintf(&Dest, "del %s", v9[1]);
        system(&Dest);
        sprintf(&Dest, "ren tmp %s", v9[1]);
        system(&Dest);
        result = 0;
      }
      else
      {
        printf(&byte_40404B, v9[1]);
        result = -1;
      }
      return result;
    }
    

    转化为ASCII码,用ord(i)

    .enc文件只有52位,可以直接爆破(第一次使用爆破)
    import string
    enc = 'jeihjiiklwjnk{ljj{kflghhj{ilk{k{kij{ihlgkfkhkwhhjgly'

    v7 和 enc 的位数是一样的,所以按位判断

    这个需要一个字符序列吧(这个就是所有可打印字符,python里面直接使用)

    dic = string.printable
    flag = ''
    num = []
    for i in enc:
    num.append(ord(i))

    def entrcy1(x):

    for i in dic:

    if ord(i) + 53 == x:

    return chr(i)

    f1 = lambda x: chr(x - 53)
    def entrcy2(x):
    for i in dic:
    if ord(i) + ord(i) % 11 == x:
    return chr(i)
    def entrcy3(x):
    for i in dic:
    if ord(i) - ord(i) % 61 == x:
    return chr(i)

    爆破函数,逐位爆破

    def crack():
    	ans = ''
    	for i in num:
    		
    		except:try:
    			ans += f1(i)
    			pass
    
    		try:
    			ans += entrcy2(i)
    		except:
    			pass
    
    		try:
    			ans += entrcy3(i)
    		except:
    			pass
    
    	return ans
    print(crack())
    

  • 相关阅读:
    mac 终端常见指令
    git常见指令
    iOS8的autolayout和size class
    UIWindow详解
    操作系统Unix、Windows、Mac OS、Linux的故事
    iOS引用当前显示的UIAlertView
    Unexpected CFBundleExecutable Key
    《CODE》讲了什么?
    exit和return的区别
    php 登录注册api接口代码
  • 原文地址:https://www.cnblogs.com/serendipity-my/p/13738985.html
Copyright © 2020-2023  润新知