团队名称:香蕉君
题目说明和答案在Duplicity题目说明.zip
压缩包中
本题大致逻辑是以已知字符串的md5值为AES密钥,加密输入,并与已知数组进行对比;同时用异常处理藏起魔改逻辑,需要细心查看汇编代码才可发现。
主要魔改点(其余异常处理用于反调试):
1)在md5中,用除0异常(本函数中ebx的值不影响其他部分,故不考虑存储)调用exception_md5_change45
,魔改k[42]。
2)在AES的keyExpansion中,多次用未知指令异常调用exception_aes_sbox
,交换S盒的两个值(同时起到花指令混淆的作用)。
3)在AES的shiftRow中,用未知指令异常魔改移动方向(同时起到花指令混淆的作用)。
4)在AES的GMul中,用除0异常魔改用来比较的已知密文字节。
可以patch掉异常处理进行调试,也可以静态硬刚。
然后根据算法魔改的部分编写exp就可以了。
exp关键部分:
flag{db5c6a8dfec4d0ec5569899640}
/
/
1
k[
42
]
=
0xD4AF3085
;
/
/
2
void swap_aes_sbox() {
inv_S[S[
113
]] ^
=
inv_S[S[
163
]];
inv_S[S[
163
]] ^
=
inv_S[S[
113
]];
inv_S[S[
113
]] ^
=
inv_S[S[
163
]];
return
;
}
int
keyExpansion(const uint8_t
*
key, uint32_t keyLen, AesKey
*
aesKey) {
uint32_t
*
w
=
aesKey
-
>eK;
uint32_t
*
v
=
aesKey
-
>dK;
/
*
W[
0
-
3
]
*
/
for
(
int
i
=
0
; i <
4
;
+
+
i) {
swap_aes_sbox();
LOAD32H(w[i], key
+
4
*
i);
}
/
*
W[
4
-
43
]
*
/
for
(
int
i
=
0
; i <
10
;
+
+
i) {
swap_aes_sbox();
w[
4
]
=
w[
0
] ^ MIX(w[
3
]) ^ rcon[i];
w[
5
]
=
w[
1
] ^ w[
4
];
w[
6
]
=
w[
2
] ^ w[
5
];
w[
7
]
=
w[
3
] ^ w[
6
];
w
+
=
4
;
}
w
=
aesKey
-
>eK
+
44
-
4
;
for
(
int
j
=
0
; j <
11
;
+
+
j) {
swap_aes_sbox();
for
(
int
i
=
0
; i <
4
;
+
+
i) {
v[i]
=
w[i];
}
w
-
=
4
;
v
+
=
4
;
}
return
0
;
}
/
/
3
int
invShiftRows(uint8_t (
*
state)[
4
]) {
uint32_t block[
4
]
=
{
0
};
for
(
int
i
=
0
; i <
4
;
+
+
i) {
LOAD32H(block[i], state[i]);
block[i]
=
ROF32(block[i],
8
*
i);
STORE32H(block[i], state[i]);
}
return
0
;
}
/
/
4
byte_41C200[
16
]
=
244
;
byte_41C200[
17
]
=
242
;
/
/
1
k[
42
]
=
0xD4AF3085
;
/
/
2
void swap_aes_sbox() {
inv_S[S[
113
]] ^
=
inv_S[S[
163
]];
inv_S[S[
163
]] ^
=
inv_S[S[
113
]];
inv_S[S[
113
]] ^
=
inv_S[S[
163
]];
return
;
}
int
keyExpansion(const uint8_t
*
key, uint32_t keyLen, AesKey
*
aesKey) {
uint32_t
*
w
=
aesKey
-
>eK;
uint32_t
*
v
=
aesKey
-
>dK;
/
*
W[
0
-
3
]
*
/
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2022-5-15 12:49
被c10udlnk编辑
,原因: