鱼C论坛

 找回密码
 立即注册
查看: 839|回复: 9

[已解决]求助一段代码的逆向

[复制链接]
发表于 2018-8-1 14:14:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有一段加密算法是下面这样子的

  for ( l = 1; l <= v5; ++l ) //v5是输入字符串的长度
  {
    v12 = byte_409910[l];
    if ( (char)(byte_409910[l] + 13) < 61 )
      v13 = v12 ^ 0x34;
    else
      v13 = v12 ^ 0x37;
    byte_409910[l] = v13;
  }

我想问一下应该如何求逆算法 主要是不知道原文是经过if还是else
最佳答案
2018-8-1 15:01:19
  1. #include <stdio.h>
  2. #include <string.h>

  3. void Encryption(char *data, int len)
  4. {
  5.         for(int i = 0; i < len; ++i)
  6.         {
  7.                 if(data[i] + 13 < 61)
  8.                 {
  9.                         data[i] ^= 0x34;
  10.                 }
  11.                 else
  12.                 {
  13.                         data[i] ^= 0x37;
  14.                 }
  15.         }
  16. }

  17. void Decryption(char *data, int len)
  18. {
  19.         for(int i = 0; i < len; ++i)
  20.         {
  21.                 char byte = data[i] ^ 0x34;
  22.                 if(byte + 13 < 61)
  23.                 {
  24.                         data[i] ^= 0x34;
  25.                 }
  26.                 else
  27.                 {
  28.                         data[i] ^= 0x37;
  29.                 }
  30.         }
  31. }

  32. int main(void)
  33. {
  34.         char str[] = "hello world!";
  35.         int len = strlen(str) + 1;

  36.         Encryption(str, len);
  37.         for(int i = 0; i < len; ++i)
  38.         {
  39.                 printf("0x%.2X -> %c\n", str[i], str[i]);
  40.         }
  41.         printf("\n");
  42.        
  43.         Decryption(str, len);
  44.         for(int i = 0; i < len; ++i)
  45.         {
  46.                 printf("0x%.2X -> %c\n", str[i], str[i]);
  47.         }
  48.         printf("\n");

  49.         return 0;
  50. }
复制代码


1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-1 14:19:07 | 显示全部楼层
本帖最后由 无符号整形 于 2018-8-1 14:20 编辑

那么 byte_409910是不是输入字符串?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-1 14:43:34 | 显示全部楼层
给你个思路,反向求if,else的话可以这样:
  1. for (int i = s.length(); i >= 0; --i)
  2.         {
  3.                 if (~(s[i] ^ 0x34) + 13 < 61)
  4.                         ch[i] = ~(s[i] ^ 0x34);
  5.                 else
  6.                         ch[i] = ~(s[i] ^ 0x37);
  7.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-1 15:01:19 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <string.h>

  3. void Encryption(char *data, int len)
  4. {
  5.         for(int i = 0; i < len; ++i)
  6.         {
  7.                 if(data[i] + 13 < 61)
  8.                 {
  9.                         data[i] ^= 0x34;
  10.                 }
  11.                 else
  12.                 {
  13.                         data[i] ^= 0x37;
  14.                 }
  15.         }
  16. }

  17. void Decryption(char *data, int len)
  18. {
  19.         for(int i = 0; i < len; ++i)
  20.         {
  21.                 char byte = data[i] ^ 0x34;
  22.                 if(byte + 13 < 61)
  23.                 {
  24.                         data[i] ^= 0x34;
  25.                 }
  26.                 else
  27.                 {
  28.                         data[i] ^= 0x37;
  29.                 }
  30.         }
  31. }

  32. int main(void)
  33. {
  34.         char str[] = "hello world!";
  35.         int len = strlen(str) + 1;

  36.         Encryption(str, len);
  37.         for(int i = 0; i < len; ++i)
  38.         {
  39.                 printf("0x%.2X -> %c\n", str[i], str[i]);
  40.         }
  41.         printf("\n");
  42.        
  43.         Decryption(str, len);
  44.         for(int i = 0; i < len; ++i)
  45.         {
  46.                 printf("0x%.2X -> %c\n", str[i], str[i]);
  47.         }
  48.         printf("\n");

  49.         return 0;
  50. }
复制代码


1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-1 19:12:24 | 显示全部楼层

大佬 好像这个并不行
不知道为什么上传不了图片 我直接复制吧
flags = raw_input('')
flag = []
def jiami():
        for i in flags:
                if ord(i) + 13 < 61:
                        flag.append(ord(i)^0x34)
                else:
                        flag.append(ord(i)^0x64)

def jiemi():
        for i in range(len(flag)):
                if (i^0x34) + 13 < 61:
                        flag = flag^0x34
                else:
                        flag = flag^0x64
jiami()
jiemi()
for i in range(len(flag)):
        flag = chr(flag)
print flag

这是我的代码  

这是我的输入和输出
aaaaaafffffffffffffaa12365
['a', 'a', 'a', 'a', 'a', 'a', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', '6', '6', '6', '1', '1', 'a', 'b', 'c', 'f', 'e']
前面还行  就是后面就不对了  再经过加密和解密之后
如果是字符串长度较小的话就ok
avddf25df
['a', 'v', 'd', 'd', 'f', '2', '5', 'd', 'f']

要不我把题目给你看看?这是一道ctf的逆向题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-1 19:28:34 | 显示全部楼层
无符号整形 发表于 2018-8-1 14:43
给你个思路,反向求if,else的话可以这样:

取反不行 取反的话 数字会超出ascii的范围 但是  如果去掉取反的话也不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-1 20:05:36 | 显示全部楼层
qq1258187869 发表于 2018-9-1 19:12
大佬 好像这个并不行
不知道为什么上传不了图片 我直接复制吧
flags = raw_input('')

def jiemi():
        for i in range(len(flag)):
                if (i^0x34) + 13 < 61:
                        flag = flag^0x34
                else:
                        flag = flag^0x64

flag 是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-1 20:06:09 | 显示全部楼层
python中有这样的语法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-1 20:23:37 | 显示全部楼层
qq1258187869 发表于 2018-9-1 19:12
大佬 好像这个并不行
不知道为什么上传不了图片 我直接复制吧
flags = raw_input('')

  1. def Encryption(data):
  2.         encryption_data = []
  3.         for i in data:
  4.                 if ord(i) + 13 < 61:
  5.                         encryption_data.append(chr(ord(i) ^ 0x34))
  6.                 else:
  7.                         encryption_data.append(chr(ord(i) ^ 0x37))
  8.         return encryption_data

  9. def Decryption(data):
  10.         decryption_data = []
  11.         for i in data:
  12.                 byte = ord(i) ^ 0x34
  13.                 if byte + 13 < 61:
  14.                         decryption_data.append(chr(ord(i) ^ 0x34))
  15.                 else:
  16.                         decryption_data.append(chr(ord(i) ^ 0x37))
  17.         return decryption_data


  18. data = input('请输入: ')
  19. data = list(data)
  20. encryption_data = Encryption(data)
  21. print(encryption_data)
  22. decryption_data = Decryption(encryption_data)
  23. print(decryption_data)
复制代码

  1. 请输入: aaaaaafffffffffffffaa12365
  2. 'V', 'V', 'V', 'V', 'V', 'V', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'V', 'V', '\x06', '\x05', '\x04', '\x01', '\x02']
  3. 'a', 'a', 'a', 'a', 'a', 'a', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'a', 'a', '1', '2', '3', '6', '5']
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-1 22:56:57 | 显示全部楼层

好的 谢谢大佬 明明是复制的 不懂我上次的代码和我这里的不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 21:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表