[GWCTF 2019]xxor 笔记

感觉自己逆向还没有入门。。。。。。还需要多做题

利用PE查壳得他是一个64位的文件,用相应的ida打开找的mian的函数

我们会输入六个数组来得到flag

先看sub_400770这个函数

 这里的a1[0]和a1[5]是不是ida翻译错了,然后查看汇编将他们对应的16进制转化了一下,发现是真的错了,还是要多看看汇编。

算是一个比较简单的检验函数,经过计算得的个a1[]的值为:3746099070, 550153460, 3774025685, 1548802262, 2652626477, 2230518816(其实我是手算的,还不会写Python,丢人,赶紧去学Python)参考别人用Python的z3计算出了数组

from z3 import *

a2,a3,a4 = BitVecs('a2 a3 a4',64)
s = Solver()
s.add(a2 - a3 == 2225223423)
s.add(a3 + a4 == 4201428739)
s.add(a2 - a4 == 1121399208)
if s.check() == sat:
    m = s.model()
    for i in m:
        print("%s = %ld" % (i, m[i].as_long()))

(6条消息) [MRCTF2020]Transform-[WUSTCTF2020]level1-[WUSTCTF2020]level2-[GWCTF 2019]xxor_AlienEowynWan的博客-CSDN博客

 接下来就是加密函数

 总的来说就是对我们输入的六个数组逐一进行加密,加密函数在sub_400686

加密情况就一目了然了。进行反向解密(其实就是反过来),脚本如下:

#include <stdio.h>

int main()
{
    unsigned int a[6]={3746099070, 550153460, 3774025685, 1548802262, 2652626477, 2230518816};
    unsigned int a2[4] = { 2,2,3,4 };
    unsigned int v3, v4;
    int v5;
    int j,i;
    for (j = 0; j <= 4; j += 2) {
        v3 = a[j];
        v4 = a[j + 1];
        v5 = 1166789954*64;
        for (i = 0; i <= 0x3F; ++i) {
            v4 -= (v3 + v5 + 20) ^ ((v3 << 6) + a2[2]) ^ ((v3 >> 9) + a2[3]) ^ 0x10;
            v3 -= (v4 + v5 + 11) ^ ((v4 << 6) + *a2) ^ ((v4 >> 9) + a2[1]) ^ 0x20;
            v5 -= 1166789954;
        }
        a[j] = v3;
        a[j + 1] = v4;
    }

    for (i = 0; i < 6; ++i)
        
        printf("%x", a[i]);
   
}

输出16进制,后转换得

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值