题目文件下载地址:
链接:https://pan.baidu.com/s/1CcaW8R02wB6puHSCsY89nQ
提取码:0syj
找到mainmain开始分析
对main_check的分析,其实就在这个函数里,一个字符串地址给的提示
然后回到main函数分析这个主要的加密
点进去之后发现是改了delta的一个xtea加密
然后分析一下过程,看一下哪些变量对应哪些变量
这里给个链接,这篇文章中有TEA,XTEA,XXTEA三种加解密的分析
https://bbs.pediy.com/thread-266933.htm
然后现在我们还需要key和加密后的数据才能解密,分析了加密过程我们知道这个key就是v21,我们随便输入flag{12345678-1234-1234-1234-12345678abcd}满足前面条件的假flag
然后进行动调
直接在那条命令的下一条指令下断点F9然后查看V21的值即可得到key,如下图
得到key为{0x10203, 0x4050607, 0x8090A0B, 0x0C0D0E0F};
继续动调,到比较函数的地方下个断点再次F9,然后F7进入比较函数
慢慢单步,发现cmd rdi, rsi的时候我们可以得到我们想要的加密之后的值(我是连续动调了两次发现这个值没变得出的这个是加密后的数据这个结论的)
得到加密后的值:0EC311F045C79AF3EDF5D910542702CB
上脚本:
/
*
take
64
bits of data
in
v[
0
]
and
v[
1
]
and
128
bits of key[
0
]
-
key[
3
]
*
/
void encipher(unsigned
int
num_rounds, uint32_t v[
2
], uint32_t const key[
4
])
{
unsigned
int
i;
uint32_t v0
=
v[
0
], v1
=
v[
1
],
sum
=
0
, delta
=
0x12345678
;
for
(i
=
0
; i < num_rounds; i
+
+
) {
v0
+
=
(((v1 <<
4
) ^ (v1 >>
5
))
+
v1) ^ (
sum
+
key[
sum
&
3
]);
sum
+
=
delta;
v1
+
=
(((v0 <<
4
) ^ (v0 >>
5
))
+
v0) ^ (
sum
+
key[(
sum
>>
11
) &
3
]);
}
v[
0
]
=
v0; v[
1
]
=
v1;
}
void decipher(unsigned
int
num_rounds, uint32_t v[
2
], uint32_t const key[
4
]) {
unsigned
int
i;
uint32_t v0
=
v[
0
], v1
=
v[
1
], delta
=
0x12345678
,
sum
=
delta
*
num_rounds;
for
(i
=
0
; i < num_rounds; i
+
+
) {
v1
-
=
(((v0 <<
4
) ^ (v0 >>
5
))
+
v0) ^ (
sum
+
key[(
sum
>>
11
) &
3
]);
sum
-
=
delta;
v0
-
=
(((v1 <<
4
) ^ (v1 >>
5
))
+
v1) ^ (
sum
+
key[
sum
&
3
]);
}
v[
0
]
=
v0; v[
1
]
=
v1;
}
int
main()
{
uint32_t v_part1[
2
]
=
{
0x0EC311F0
,
0x45C79AF3
};
/
/
动调得到的加密后的值,内存中就是小端储存我们不用再手动改变
0EC311F0
45C79AF3
EDF5D910
542702CB
uint32_t v_part2[
2
]
=
{
0xEDF5D910
,
0x542702CB
};
uint32_t const k[
4
]
=
{
0x10203
,
0x4050607
,
0x8090A0B
,
0x0C0D0E0F
};
/
/
动调得到的key
unsigned
int
r
=
32
;
/
/
num_rounds建议取值为
32
/
/
v为要加密的数据是两个
32
位无符号整数
/
/
k为加密解密密钥,为
4
个
32
位无符号整数,即密钥长度为
128
位printf(
"加密前原始数据:%u %u\n"
,v[
0
],v[
1
]);
/
/
encipher(r, v, k);
/
/
printf(
"加密后的数据:%u %u\n"
,v[
0
],v[
1
]);
decipher(r, v_part1, k);
decipher(r, v_part2, k);
printf(
"解密后的数据:%x %x %x %x\n"
,v_part1[
0
],v_part1[
1
], v_part2[
0
], v_part2[
1
]);
return
0
;
}
/
/
最后按照开始分析的flag的格式排列一下得到flag{
3bbcf9ea
-
2918
-
4fee
-
8a2e
-
201b47dfcb4e
}
/
*
take
64
bits of data
in
v[
0
]
and
v[
1
]
and
128
bits of key[
0
]
-
key[
3
]
*
/
void encipher(unsigned
int
num_rounds, uint32_t v[
2
], uint32_t const key[
4
])
{
unsigned
int
i;
uint32_t v0
=
v[
0
], v1
=
v[
1
],
sum
=
0
, delta
=
0x12345678
;
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-4-22 17:42
被kanxue编辑
,原因: 上传附件