IDF実験室の逆行逆施python ByteCode

1975 ワード

ダウンロードしたのはpycファイルで、uncompyle 2で逆コンパイルして、コードを得ます:
def encrypt(key, seed, string):
    rst = []
    for v in string:
        rst.append((ord(v) + seed ^ ord(key[seed])) % 255)
        seed = (seed + 1) % len(key)
    return rst


if __name__ == '__main__':
    print 'Welcome to idf\'s python crackme'
    flag = input('Enter the Flag: ')
    KEY1 = 'Maybe you are good at decryptint Byte Code, have a try!'
    KEY2 = [124, 48, 52, 59, 164, 50, 37, 62, 67, 52, 48, 6, 1, 122, 3, 22, 72, 1, 1, 14, 46, 27, 232]
    en_out = encrypt(KEY1, 5, flag)
    if KEY2 == en_out:
        print 'You Win'
    else:
        print 'Try Again !'

はい、ソースコードが見えました.暗号化アルゴリズムは(ord(v)+seed^ord(key[seed])%255です.
この暗号化は逆方向では推しにくいようですが、直接暴力的に解読しましょう.pythonがよく分からないので、C#で書きました.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestDecode
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string KEY1 = "Maybe you are good at decryptint Byte Code, have a try!";
            int[] KEY2 = { 124, 48, 52, 59, 164, 50, 37, 62, 67, 52, 48, 6, 1, 122, 3, 22, 72, 1, 1, 14, 46, 27, 232 };
            for(int i = 0; i < KEY2.Length; i++)
            {
                for(int j=0;j<255;j++)
                    if (encrypt(KEY1, i + 5, (char)j) == KEY2[i])
                    {
                        textBox1.Text += (char)j;
                        break;
                    }
            }

        }
        private int encrypt(string key, int seed, char v)
        {
            return ((int)v + seed ^ (int)key[seed]) % 255;
        }
    }
}

OK、結果が出た、WCTF{ILOVEPYTHONSOMUCH}、提出、通過!