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