qq1258187869 发表于 2018-8-1 14:14:26

求助一段代码的逆向

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

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

我想问一下应该如何求逆算法 主要是不知道原文是经过if还是else

无符号整形 发表于 2018-8-1 14:19:07

本帖最后由 无符号整形 于 2018-8-1 14:20 编辑

那么 byte_409910是不是输入字符串?

无符号整形 发表于 2018-8-1 14:43:34

给你个思路,反向求if,else的话可以这样:
for (int i = s.length(); i >= 0; --i)
        {
                if (~(s ^ 0x34) + 13 < 61)
                        ch = ~(s ^ 0x34);
                else
                        ch = ~(s ^ 0x37);
        }

人造人 发表于 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 + 13 < 61)
                {
                        data ^= 0x34;
                }
                else
                {
                        data ^= 0x37;
                }
        }
}

void Decryption(char *data, int len)
{
        for(int i = 0; i < len; ++i)
        {
                char byte = data ^ 0x34;
                if(byte + 13 < 61)
                {
                        data ^= 0x34;
                }
                else
                {
                        data ^= 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, str);
        }
        printf("\n");
       
        Decryption(str, len);
        for(int i = 0; i < len; ++i)
        {
                printf("0x%.2X -> %c\n", str, str);
        }
        printf("\n");

        return 0;
}


qq1258187869 发表于 2018-9-1 19:12:24

人造人 发表于 2018-8-1 15:01


大佬 好像这个并不行
不知道为什么上传不了图片 我直接复制吧
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的逆向题目

qq1258187869 发表于 2018-9-1 19:28:34

无符号整形 发表于 2018-8-1 14:43
给你个思路,反向求if,else的话可以这样:

取反不行 取反的话 数字会超出ascii的范围 但是如果去掉取反的话也不行

人造人 发表于 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 是什么?

人造人 发表于 2018-9-1 20:06:09

python中有这样的语法吗?

人造人 发表于 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']

qq1258187869 发表于 2018-9-1 22:56:57

人造人 发表于 2018-9-1 20:23


好的 谢谢大佬 明明是复制的 不懂我上次的代码和我这里的不一样
页: [1]
查看完整版本: 求助一段代码的逆向