RE

信使

喵喵喵的flag碎了一地

你真的是大学生吗?

可耻的是,这道题还是看了一会笔记才想起来该怎么做……

本题是16bit程序逆向,其实就是考察汇编

第一段操作:0003~000B

这里的操作首先将unk_10000的地址传给了dx寄存器,

根据unk_10000的内容可以推断这里是打印input字符串内容的部分

第二段操作:000d~0013

这段同理,可根据unk_1002d推断这里是读取输入字符,长度即为unk_1002d所存储值

第三段操作:0015~001b

同理,这里的0a0d分别为换行符和回车符,所以可以猜测是输入结束的标志

第四段操作:001d~002a

这段开始先将cx,ax两个寄存器与其本身异或以将其赋零

随后将byte_1002e的内容传给了c低寄存器

而地址为1002e的是0

dseg:002E byte_1002E      db 0                    ; DATA XREF: start+21↓r

随后将si寄存器设为2F,并将这个值传递给al寄存器并加上cx里的值,由于这一段开头我们已经清理了寄存器所以不变

第五段操作:002c~003d

给阿姨倒一杯卡布奇诺

快速扫一眼main函数,不难发现这是一个TEA加密,于是迅速进入encrypt函数

可以发现这并不是一个标准的TEA加密,在开始时明文被异或上了data1和data2

delta也被改成了0x6e75316c

#include<bits/stdc++.h>
​
​
​
void tea_dec(uint32_t* v, uint32_t* k) {
    uint32_t data1=0x5F797274;
    uint32_t data2=0x64726168;
    uint32_t v0 = v[0], v1 = v[1];  
    uint32_t delta = 0x6e75316c;     
    uint32_t sum = (32 * delta) & 0xffffffff;     
    for (int i = 0; i < 32; i++) {  
        
        v1 -= ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]) ^ (sum + (31 - i));
        v0 -= ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]) ^ (sum + (31 - i));
        sum -= delta;
    }
   
    v[0] = v0;
    v[1] = v1;
}
​
int main()
{
    int i;
    uint32_t t[2];
    uint32_t array[] = {0X9B28ED45, 0x145EC6E9, 0x5B27A6C3, 0xE59E75D5, 0xE82C2500, 0xA4211D92, 0xCD8A4B62, 0xA668F440};
    uint32_t key[4] = {0x65766967, 0x756F795F,  0x7075635F, 0x6165745F};
    for(i=0;i <= 7;i++)
    {
        t[0] = array[i];
        t[1] = array[i+1]; 
        tea_dec(t,key);
​
    }
    
    return 0;
 } 

其实这就是cbc模式的tea,

CBC模式(Cipher Block Chaining):其实主要就是将明文分组与前一个密文分组进行异或运算,然后再进行加密,对于第一组的话就设置一个初始值来和第一组明文异或 比如:(CBC模式循环加密64字节,每次循环加密8字节(v0和v1各4字节))

所以实际上在这个过程中加密的是data1和data2