avatar

5.8日笔记 (week 3)

5.8日更新

因为5.30号要进行RCTF了,我就想做一下去年的题目,来看看什么样的,👴这就开始做!

babyre1

image-20200507102001655

可以看到这里有一个md5的一个验证,我猜测是多解否则不可能让我们进行md5校验

我们拿到文件后,我放到linux和ida中分别看一下

image-20200506155735892

我们看一下主要的逻辑

image-20200507102130953

这边用findkey扫一下,发现有tea加密算法,大概看了一下

image-20200507102538506

这几个满足才可以执行到puts(v9)输出bingo,我们动态调试一下,因为我们知道判断的长度的条件是16,直接测试1234567890123456

image-20200507104345152

可以看到我们的值在0x7FFD5A85E80这里,我们动调分析一下逻辑

image-20200507105824699

可以看出来第一个函数将我们的压入的值,变成了hex

image-20200507112307681

这里应该是XXTEA解密,首先排除TEA因为TEA加密没有拿黄金比例相乘的地方,而XTEA和TEA解密有 再看相乘的数据

一对比就可以知道为XXTEA解密,解密之后的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdint.h>
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))

void btea(uint32_t *v, int n, uint32_t const key[4])
{
uint32_t y, z, sum;
unsigned p, rounds, e;
if (n > 1) /* Coding Part */
{
rounds = 6 + 52/n;
sum = 0;
z = v[n-1];
do
{
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++)
{
y = v[p+1];
z = v[p] += MX;
}
y = v[0];
z = v[n-1] += MX;
}
while (--rounds);
}
else if (n < -1) /* Decoding Part */
{
n = -n;
rounds = 6 + 52/n;
sum = rounds*DELTA;
y = v[0];
do
{
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--)
{
z = v[p-1];
y = v[p] -= MX;
}
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
}
while (--rounds);
}
}


int main()
{
uint32_t v[2]= {1,2};
uint32_t const k[4]= {2,2,3,4};
int n= 2; //n的绝对值表示v的长度,取正表示加密,取负表示解密
// v为要加密的数据是两个32位无符号整数
// k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
printf("加密前原始数据:%u %u\n",v[0],v[1]);
btea(v, n, k);
printf("加密后的数据:%u %u\n",v[0],v[1]);
btea(v, -n, k);
printf("解密后的数据:%u %u\n",v[0],v[1]);
return 0;
}

源码可以看到有DELTA=0x9e3779b9 向乘的数据

image-20200508171718909

不难知道 RDX是解密密钥也就是加密密钥,RDI是解密数据,RSI是加密和解密的方式

解密密钥:C7 E0 C7 E0 D7 D3 F1 C6 D3 C6 D3 C6 CE D2 D0 C4 C7E0C7E0D7D3F1C6D3C6D3C6CED2D0C4

image-20200508172350726

即:青青子衿悠悠我心

image-20200508173700664

这个位置校验了最后一个位置要小于等于4

image-20200508174228233

之后这里进行了CRC16校验,由于我们题中给的输出正确的是Bingo!是根据解密数据0x17异或得到的,这里的v12一直都是8,所以少了 7 8位置的 0x55 0x7e 0x79 0x70 0x78 0x36 ,前面位置是这些,我试着搞一下xxtea,8这个位置是个截断的数据,根据v12 - 8位的数据 = 位置的0x00 所以 8的位置就是0x2 数据应该是 0x55 0x7e 0x79 0x70 0x78 0x36 0x?? 0x02

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdint.h>
#include<iostream>
using namespace std;
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))

void btea(uint32_t* v, int n, uint32_t const key[4])
{
uint32_t y, z, sum;
unsigned p, rounds, e;
if (n > 1) /* Coding Part */
{
rounds = 6 + 52 / n;
sum = 0;
z = v[n - 1];
do
{
sum += DELTA;
e = (sum >> 2) & 3;
for (p = 0; p < n - 1; p++)
{
y = v[p + 1];
z = v[p] += MX;
}
y = v[0];
z = v[n - 1] += MX;
} while (--rounds);
}
else if (n < -1) /* Decoding Part */
{
n = -n;
rounds = 6 + 52 / n;
sum = rounds * DELTA;
y = v[0];
do
{
e = (sum >> 2) & 3;
for (p = n - 1; p > 0; p--)
{
z = v[p - 1];
y = v[p] -= MX;
}
z = v[n - 1];
y = v[0] -= MX;
sum -= DELTA;
} while (--rounds);
}
}


int main()
{
for (int i = 0; i <= 0xff; i++) {
unsigned int b = 0x02003678;
b = b + (i << 16);
uint32_t v[2] = { (unsigned int)0x70797e55, b };
uint32_t const k[4] = { (unsigned int)0xE0C7E0C7, (unsigned int)0XC6F1D3D7, (unsigned int)0xc6d3c6d3, (unsigned int)0xc4d0d2ce };
int n = 2; //n的绝对值表示v的长度,取正表示加密,取负表示解密
// v为要加密的数据是两个32位无符号整数
// k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
btea(v, n, k);
printf("%x%x\n", v[0], v[1]);
}
}

image-20200508200909348

image-20200508200916506

多解的,因为截断在02,所有的在后面CRC后都是个0x55 0x7e 0x79 0x70 0x78 0x36 0x00 0x02这样的,题目中有个md5值,试一下就可以了,pkcs7一般分组密码都是这么padding的,所以按照规则应该是0x55 0x7e 0x79 0x70 0x78 0x36 0x02 0x02,所以答案就是,上面的第三个 05e8a376e4e0446e: rctf{05e8a376e4e0446e}

babyre2

image-20200508202430891

他说什么什么另一个宝宝re给👴,我去看看是啥宝宝,用ida打开

image-20200508220102964

我们去看一下逻辑,算了👴直接去动态调试吧,费劲巴拉!

image-20200509000023722

这里处理的是Please input the account:长度8-16

image-20200509001232491

处理的是Please input the password:长度8-16,每个字符为9-98

image-20200509001720665

好的,暂时不知道干了啥

image-20200509002019797

Please input the data:输入data,长度1-1023,只允许输入[0-9a-fA-F]

image-20200509003351986

我们回来看一下,这里是我们数据的一个输入点,我们进去分析刚才没有分析完的

image-20200509003718138

这里又进行了xxtea算法,我们的输入作为了key

image-20200509005313612

进行的是password的每一位减去十位和个位,减去的结果作为下标从data取数据,得到data

image-20200509010930620

再把得到的data和0xCC异或

image-20200509012432908

又用了xxtea

我分析的就是 我们输入账号然后进行xxtea加密,然后password经过data操作后才变成第二个数据,把第二个数据进行异或,放入xxtea然后让他变成最开始的那个数据,这里用了点pwn的脚本,俺不太会!呜呜呜,这里直接看了wp,大概原理懂!

image-20200509013504002

DontEatMe

image-20200509014409848

直接用ida打开

image-20200509014522959

搜索了一下 用了什么算法

image-20200509014745974

用了BLOWFLSH算法,睡觉去!明天再继续写吧!最近身体真的是不好,所以先睡了!

Author: L0x1c
Link: https://l0x1c.github.io/2020/05/06/2020-5-8/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶