鱼C论坛

 找回密码
 立即注册
查看: 959|回复: 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
#include <stdio.h>
#include <string.h>

void Encryption(char *data, int len)
{
        for(int i = 0; i < len; ++i)
        {
                if(data[i] + 13 < 61)
                {
                        data[i] ^= 0x34;
                }
                else
                {
                        data[i] ^= 0x37;
                }
        }
}

void Decryption(char *data, int len)
{
        for(int i = 0; i < len; ++i)
        {
                char byte = data[i] ^ 0x34;
                if(byte + 13 < 61)
                {
                        data[i] ^= 0x34;
                }
                else
                {
                        data[i] ^= 0x37;
                }
        }
}

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

        Encryption(str, len);
        for(int i = 0; i < len; ++i)
        {
                printf("0x%.2X -> %c\n", str[i], str[i]);
        }
        printf("\n");
        
        Decryption(str, len);
        for(int i = 0; i < len; ++i)
        {
                printf("0x%.2X -> %c\n", str[i], str[i]);
        }
        printf("\n");

        return 0;
}

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的话可以这样:
for (int i = s.length(); i >= 0; --i)
        {
                if (~(s[i] ^ 0x34) + 13 < 61)
                        ch[i] = ~(s[i] ^ 0x34);
                else
                        ch[i] = ~(s[i] ^ 0x37);
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

void Encryption(char *data, int len)
{
        for(int i = 0; i < len; ++i)
        {
                if(data[i] + 13 < 61)
                {
                        data[i] ^= 0x34;
                }
                else
                {
                        data[i] ^= 0x37;
                }
        }
}

void Decryption(char *data, int len)
{
        for(int i = 0; i < len; ++i)
        {
                char byte = data[i] ^ 0x34;
                if(byte + 13 < 61)
                {
                        data[i] ^= 0x34;
                }
                else
                {
                        data[i] ^= 0x37;
                }
        }
}

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

        Encryption(str, len);
        for(int i = 0; i < len; ++i)
        {
                printf("0x%.2X -> %c\n", str[i], str[i]);
        }
        printf("\n");
        
        Decryption(str, len);
        for(int i = 0; i < len; ++i)
        {
                printf("0x%.2X -> %c\n", str[i], str[i]);
        }
        printf("\n");

        return 0;
}

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[i] = flag[i]^0x34
                else:
                        flag[i] = flag[i]^0x64
jiami()
jiemi()
for i in range(len(flag)):
        flag[i] = chr(flag[i])
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('')

def Encryption(data):
        encryption_data = []
        for i in data:
                if ord(i) + 13 < 61:
                        encryption_data.append(chr(ord(i) ^ 0x34))
                else:
                        encryption_data.append(chr(ord(i) ^ 0x37))
        return encryption_data

def Decryption(data):
        decryption_data = []
        for i in data:
                byte = ord(i) ^ 0x34
                if byte + 13 < 61:
                        decryption_data.append(chr(ord(i) ^ 0x34))
                else:
                        decryption_data.append(chr(ord(i) ^ 0x37))
        return decryption_data


data = input('请输入: ')
data = list(data)
encryption_data = Encryption(data)
print(encryption_data)
decryption_data = Decryption(encryption_data)
print(decryption_data)
请输入: aaaaaafffffffffffffaa12365
'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']
'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-12-23 22:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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