Skip to content

Commit 7ff7ddc

Browse files
committed
add lession
1 parent d3272aa commit 7ff7ddc

File tree

9 files changed

+105
-28
lines changed

9 files changed

+105
-28
lines changed

Android/A06/README.md

Lines changed: 105 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,3 @@
1-
#### so 实现AES算法:
2-
3-
```
4-
一个AES算法我们要关注哪些内容?
5-
是AES-128 还是 AES-192 还是 AES-256
6-
明文是什么
7-
密钥是什么
8-
什么模式 ECB还是CBC还是其他
9-
如果是非ECB模式,那么IV是什么
10-
明文填充模式呢,是PCKS#7吗?
11-
```
12-
13-
1. 调用open_ssl封装的EVP。传入结构体,百度搜索,查看参数信息。
14-
15-
![1](./pic/1.png)
16-
17-
2. 直接使用底层的代码,通过hook各个函数,得到信息。
18-
19-
![2](./pic/2.png)
20-
211
#### 简介
222

233
```
@@ -80,6 +60,8 @@ aes把明文放在一个4*4的矩阵当中,表中每个元素是一个字节
8060
```
8161
AES-128 ----10轮运算
8262
63+
if not ECB: 明文 xor iv
64+
8365
首先是一个初始变换 --addRoundKey
8466
- 明文 xor 密钥k (这个key就是我们输入的种子密钥)
8567
然后是9轮相同的运算
@@ -243,7 +225,8 @@ w0 w1 w2 w3 w4 w5 w6 .....w43
243225
因为是aes-128, 所以每一轮密钥是16个字节,4个w是一轮的密钥。
244226

245227
初始化的addRoundKey用到的key:
246-
key0 = w0w1w2w3 = d42711aee0... 我们的种子密钥,用来做初始变换。根据我们传入的种子密钥获得10个新的密钥, hook初始变化 addroundKey的异或后面的key,就是我们输入的种子key。
228+
key0 = w0w1w2w3 = d42711aee0bf98f1b8b45de51e415230我们的种子密钥,用来做初始变换,根据我们传入的种子密钥获得10个新的子密钥。
229+
hook初始变化addroundKey的异或后面的key,就是我们输入的种子key。
247230

248231
9轮运算用到的key分别是:
249232
k1:w4w5w6w7
@@ -292,7 +275,27 @@ ida中特征:
292275
> <<31 分单双数
293276
> <<30 看是否为4的倍数
294277
295-
#### 拓展
278+
#### so 实现AES算法:
279+
280+
```
281+
一个AES算法我们要关注哪些内容?
282+
是AES-128 还是 AES-192 还是 AES-256
283+
明文是什么
284+
密钥是什么
285+
什么模式 ECB还是CBC还是其他
286+
如果是非ECB模式,那么IV是什么
287+
明文填充模式呢,是PCKS#7吗?
288+
```
289+
290+
1. 调用open_ssl封装的EVP。传入结构体,百度搜索,查看参数信息。
291+
292+
![1](./pic/1.png)
293+
294+
2. 直接使用底层的代码,通过hook各个函数,得到信息。
295+
296+
![2](./pic/2.png)
297+
298+
#### 拓展
296299
297300
```
298301
哈希算法:签名校验
@@ -323,6 +326,29 @@ findcrypt 可以找到特征
323326
```
324327
325328
```
329+
CBC模式分析:
330+
key: 0123456789abcdef str
331+
IV : 1111111111111111 str
332+
input: 0123456789abcdef 0123456789abcdef 两个分组长度
333+
result:
334+
e5b72c539aae45dea57686570b0b5156
335+
67529ac954d9dee130a26b116dc601c4
336+
337+
第一步:
338+
首先 iv xor 第一个分组的明文块0123456789abcdef 得到 hex:
339+
01 00 03 02 05 04 07 06 09 08 50 53 52 55 54 57
340+
结果进行ECB模式加密得到: e5b72c539aae45dea57686570b0b5156
341+
第二步:
342+
第二个分组的明文块和第一个秘文块做异或然后进行AES ECB模式加密
343+
e5b72c539aae45dea57686570b0b5156(hex) xor 0123456789abcdef 得到 hex:
344+
d5 86 1e 60 ae 9b 73 e9 9d 4f e7 35 68 6f 34 30
345+
结果进行ECB模式加密得到: 67529ac954d9dee130a26b116dc601c4
346+
```
347+
348+
```
349+
填充pkcs#7
350+
padding是必须存在的,如果明文已经是16个字节了, 那么也要填充10101010101010101010101010101010
351+
326352
输入:pcks#7 000102030405060708090a0b0c0d0e0f
327353
输出:a07999f0e2bfbe16f99593e984a449b7 377222e061a924c591cd9c27ea163ed4
328354

@@ -331,13 +357,64 @@ aes一个分组会填充10101010101010101010101010101010
331357

332358
验证:
333359
hex
334-
01 15个0f的字节
360+
01 15个0f的字节 (差15个字节,此时明文是hex,补充hex,hex(15) = 0xf,就是15个0f)
335361
01 02 14个0e
336-
13 个 d
337-
12 个 c
338-
11 个 b
339-
10个a
362+
01 02 03 13个0d
363+
01 02 03 04 12个0c
364+
01 02 03 04 05 11个0b
365+
01 02 03 04 05 06 10个0a
366+
注意:类似0f这种padding点 pkcs#7,在hook的时候可以看出他是明文。
367+
```
368+
369+
```
370+
在初始化的addRoundKey时是可以通过异或获得密钥的,但是因为工作模式的不同,是获取不到明文的,例如CBC模式,开始会和iv做异或。
371+
```
372+
373+
![14](./pic/14.png)
374+
375+
![15](./pic/15.png)
376+
377+
![16](./pic/16.png)
378+
379+
手动验证发现:两个值异或就等于input1,说明r8和r6寄存器的值就是iv和明文。(m 0x3742)
380+
381+
![17](./pic/17.png)
382+
383+
发现明文和input2做异或,那么他就是第一轮的addRoundKey的 明文 oxr 密钥。
384+
385+
**SBOX不同表现形式**
386+
387+
![18](./pic/18.png)
388+
389+
初始置换addRoundKey之后就应该是 S盒替换 为什么这个循环里面都不是S盒,反而是循环外面出现了S盒呢?被魔改了吗?
390+
391+
在github或者谷歌搜索: 代码`RijnDael_AES_3629C`里第一个元素`0xC66363A5`,看看有没有线索,发现是有的。[链接](https://github.com/Spittie/advancedtomato-ac/blob/f8d44eac51c1c7c45daf3e5ec324a59549aca6fc/release/src/router/libsodium/src/libsodium/crypto_stream/aes256estream/hongjun/aes-table-be.h)。
392+
393+
根据网址里面的命名进行改名,T0就是代码里RignDeal_AES_3629Czaai第一个元素`0xC66363A5`根据网址里查到的,然后进行命名修改。
394+
395+
![20](./pic/20.png)
396+
397+
![19](./pic/19.png)
398+
399+
变成了 T0、T1、T2、T3进行操作。从4个表中取值进行操作。其实是实现方式不同而已。
400+
401+
正常用SBOX实现的叫 按照算法描述去实现,样本中这种叫查表法。
402+
403+
查表法的好处:以空间换时间加快AES运算,把subBytes、shiftRows、mixcolumn前三个步骤混在一起去了,得到了4个T表。
340404
341-
101010
342405
```
406+
加解密过程中,加密用Tbox1-4,解密用Tbox5-8,前9轮用T,为什么最后一轮用Sbox不用查表法呢?
407+
1-9轮 把subBytes、shiftRows、mixcolumn前三个步骤混在一起去了所以用T。
408+
最面一轮没有mixcolumn,不能用上面混合后的表了,这时候两种方式:可以新增一个新的混合表或者分开来算 s-box、循环左移、state xor 密钥。
409+
为什么查表法不把addroudkey 和前三步放在一起呢?
410+
因为addroudkey 密钥是我们生成的,可能会变化, 混合表已经是固定的,所以放不进去。
411+
怎么把key也放进去? 就是aes白盒--加重混淆,即使有源码都无法简简单单还原出key。
412+
https://bbs.pediy.com/thread-267330.htm
413+
```
414+
415+
![21](./pic/21.png)
416+
417+
上面是查表法下面是分开计算的。
418+
419+
但是样本中和S盒还是不一样,有可能是S盒和循环左移搞在一起了。
343420

Android/A06/pic/14.png

54.2 KB
Loading

Android/A06/pic/15.png

97.1 KB
Loading

Android/A06/pic/16.png

66.1 KB
Loading

Android/A06/pic/17.png

70.8 KB
Loading

Android/A06/pic/18.png

262 KB
Loading

Android/A06/pic/19.png

142 KB
Loading

Android/A06/pic/20.png

167 KB
Loading

Android/A06/pic/21.png

354 KB
Loading

0 commit comments

Comments
 (0)