HardRe

这道题不少人在赛后与我反馈说明明调试的时候都是这样,结果却不同…

程序放入IDA中逆向分析

图片

表面上看起来像是一个base64编码 然后解密, 尝试后肯定是失败的

在base64编码的函数中首先是一个加法和xor

图片

然后是base64编码 但是在结尾抛出了异常

图片

而在base64函数中catch异常

图片

函数执行的时候并没有执行第一个base64编码 将函数直接修改jmp到异常处理的地方

图片

程序利用ptrace 进行反调试并且修改密钥的值

图片

然后经过一个xtea加密 和一个base64编码

这个编码里面依然有加法和xor

图片

然后是一个正常的base64

图片

最后将字符串比较

图片

所以整体加密思路

加法and 异或 -> Xtea加密 -> 加法and 异或 -> base64编码

根据这些逆向解密即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
key=[i for i in range(32)]
import struct
key = struct.unpack('8L', bytes(key))
#print(key)

from base64 import *
from ctypes import *


base = "iq3gDwcXsmXLMlAYQJLQ/YVYw1+CvqPf4ByJR1rMv1O5trzlwQoqDw=="
import base64
# xor -> xtea -> xor -> base
data = base64.b64decode(base)
data = [i for i in data]
for i in range(40):
data[i] = data[i]^0x32
data[i] -=i
data[i]&=0xff
print(hex(data[i]),end=',')
data=struct.unpack('10L', bytes(data))
print(data)

把xtea的密文求解出来

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
#include <stdio.h> 
#include <stdint.h>
int k[4] = {0x000012AB, 0x00007654, 0x000078AC, 0x00002B32};

void xteadecrypt(uint32_t* v, uint32_t* k) {

uint32_t v0 = v[0], v1 = v[1];
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];

int sum = 0x9e3779b9 * 32, delta = 0x9e3779b9;

for (size_t i = 0; i < 32; i++)
{

v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum >> 11) & 3]);
sum -= delta;
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
}
v[0] = v0; v[1] = v1;
}


int main()
{
;;;
unsigned int v[10]={ 986750648, 1350180913, 525924337, 3235156838, 1524586919, 3598415772, 1520506298, 1114628428, 3027002219, 384963535};

unsigned char *p = v;
for(int i=0;i<40;i++)
{
printf("%x,",p[i]);
}

for(int i=0;i<5;i++)
{
xteadecrypt(&v[2*i],k);
}

for(int i=0;i<10;i++)

{
printf("%x,",v[i]);
}
printf("\n");;;


for(int i=0;i<40;i++)
{
p[i]^=0x32;
p[i]-=i;
}

printf("%s",p);
}

求出flag

flag{1bdf524c7f1311e1da6da6e4e5176d0c9e}