@@ -58,6 +58,114 @@ excerpt: 通过自定义AES换S盒加密登录验证、利用`/log`泄露libc和
5858
5959## EXPLOIT
6060
61+ ``` python aes.py
62+ from pwn import u64
63+ # ========================================================
64+ # 纯 Python 实现 AES-128 加密 (支持自定义 S-box)
65+ # ========================================================
66+
67+ # 默认 AES S-box,可自行修改实现「换表 AES」
68+ S_BOX = [
69+ 0x 29 , 0x 40 , 0x 57 , 0x 6e , 0x 85 , 0x 9c , 0x b3 , 0x ca , 0x e1 , 0x f8 , 0x f , 0x 26 , 0x 3d , 0x 54 , 0x 6b , 0x 82 ,
70+ 0x 99 , 0x b0 , 0x c7 , 0x de , 0x f5 , 0x c , 0x 23 , 0x 3a , 0x 51 , 0x 68 , 0x 7f , 0x 96 , 0x ad , 0x c4 , 0x db , 0x f2 ,
71+ 0x 9 , 0x 20 , 0x 37 , 0x 4e , 0x 65 , 0x 7c , 0x 93 , 0x aa , 0x c1 , 0x d8 , 0x ef , 0x 6 , 0x 1d , 0x 34 , 0x 4b , 0x 62 ,
72+ 0x 79 , 0x 90 , 0x a7 , 0x be , 0x d5 , 0x ec , 0x 3 , 0x 1a , 0x 31 , 0x 48 , 0x 5f , 0x 76 , 0x 8d , 0x a4 , 0x bb , 0x d2 ,
73+ 0x e9 , 0x 0 , 0x 17 , 0x 2e , 0x 45 , 0x 5c , 0x 73 , 0x 8a , 0x a1 , 0x b8 , 0x cf , 0x e6 , 0x fd , 0x 14 , 0x 2b , 0x 42 ,
74+ 0x 59 , 0x 70 , 0x 87 , 0x 9e , 0x b5 , 0x cc , 0x e3 , 0x fa , 0x 11 , 0x 28 , 0x 3f , 0x 56 , 0x 6d , 0x 84 , 0x 9b , 0x b2 ,
75+ 0x c9 , 0x e0 , 0x f7 , 0x e , 0x 25 , 0x 3c , 0x 53 , 0x 6a , 0x 81 , 0x 98 , 0x af , 0x c6 , 0x dd , 0x f4 , 0x b , 0x 22 ,
76+ 0x 39 , 0x 50 , 0x 67 , 0x 7e , 0x 95 , 0x ac , 0x c3 , 0x da , 0x f1 , 0x 8 , 0x 1f , 0x 36 , 0x 4d , 0x 64 , 0x 7b , 0x 92 ,
77+ 0x a9 , 0x c0 , 0x d7 , 0x ee , 0x 5 , 0x 1c , 0x 33 , 0x 4a , 0x 61 , 0x 78 , 0x 8f , 0x a6 , 0x bd , 0x d4 , 0x eb , 0x 2 ,
78+ 0x 19 , 0x 30 , 0x 47 , 0x 5e , 0x 75 , 0x 8c , 0x a3 , 0x ba , 0x d1 , 0x e8 , 0x ff , 0x 16 , 0x 2d , 0x 44 , 0x 5b , 0x 72 ,
79+ 0x 89 , 0x a0 , 0x b7 , 0x ce , 0x e5 , 0x fc , 0x 13 , 0x 2a , 0x 41 , 0x 58 , 0x 6f , 0x 86 , 0x 9d , 0x b4 , 0x cb , 0x e2 ,
80+ 0x f9 , 0x 10 , 0x 27 , 0x 3e , 0x 55 , 0x 6c , 0x 83 , 0x 9a , 0x b1 , 0x c8 , 0x df , 0x f6 , 0x d , 0x 24 , 0x 3b , 0x 52 ,
81+ 0x 69 , 0x 80 , 0x 97 , 0x ae , 0x c5 , 0x dc , 0x f3 , 0x a , 0x 21 , 0x 38 , 0x 4f , 0x 66 , 0x 7d , 0x 94 , 0x ab , 0x c2 ,
82+ 0x d9 , 0x f0 , 0x 7 , 0x 1e , 0x 35 , 0x 4c , 0x 63 , 0x 7a , 0x 91 , 0x a8 , 0x bf , 0x d6 , 0x ed , 0x 4 , 0x 1b , 0x 32 ,
83+ 0x 49 , 0x 60 , 0x 77 , 0x 8e , 0x a5 , 0x bc , 0x d3 , 0x ea , 0x 1 , 0x 18 , 0x 2f , 0x 46 , 0x 5d , 0x 74 , 0x 8b , 0x a2 ,
84+ 0x b9 , 0x d0 , 0x e7 , 0x fe , 0x 15 , 0x 2c , 0x 43 , 0x 5a , 0x 71 , 0x 88 , 0x 9f , 0x b6 , 0x cd , 0x e4 , 0x fb , 0x 12 ,
85+ ]
86+
87+ R_CON = [
88+ 0x 00 , 0x 01 , 0x 02 , 0x 04 , 0x 08 , 0x 10 , 0x 20 , 0x 40 , 0x 80 , 0x 1B , 0x 36
89+ ]
90+
91+
92+ def sub_bytes (state ):
93+ return [S_BOX [b] for b in state]
94+
95+
96+ def shift_rows (s ):
97+ return [
98+ s[0 ], s[5 ], s[10 ], s[15 ],
99+ s[4 ], s[9 ], s[14 ], s[3 ],
100+ s[8 ], s[13 ], s[2 ], s[7 ],
101+ s[12 ], s[1 ], s[6 ], s[11 ]
102+ ]
103+
104+
105+ def xtime (a ):
106+ return ((a << 1 ) ^ 0x 1B ) & 0x FF if a & 0x 80 else (a << 1 )
107+
108+
109+ def mix_single_column (a ):
110+ t = a[0 ] ^ a[1 ] ^ a[2 ] ^ a[3 ]
111+ u = a[0 ]
112+ a[0 ] ^= t ^ xtime(a[0 ] ^ a[1 ])
113+ a[1 ] ^= t ^ xtime(a[1 ] ^ a[2 ])
114+ a[2 ] ^= t ^ xtime(a[2 ] ^ a[3 ])
115+ a[3 ] ^= t ^ xtime(a[3 ] ^ u)
116+ return a
117+
118+
119+ def mix_columns (s ):
120+ for i in range (4 ):
121+ col = s[i * 4 :(i + 1 ) * 4 ]
122+ s[i * 4 :(i + 1 ) * 4 ] = mix_single_column(col)
123+ return s
124+
125+
126+ def add_round_key (s , k ):
127+ return [a ^ b for a, b in zip (s, k)]
128+
129+
130+ def key_expansion (key ):
131+ key_symbols = list (key)
132+ assert len (key_symbols) == 16
133+ expanded = key_symbols[:]
134+ for i in range (4 , 44 ):
135+ t = expanded[(i - 1 ) * 4 :i * 4 ]
136+ if i % 4 == 0 :
137+ t = t[1 :] + t[:1 ]
138+ t = [S_BOX [b] for b in t]
139+ t[0 ] ^= R_CON [i // 4 ]
140+ for j in range (4 ):
141+ expanded.append(expanded[(i - 4 ) * 4 + j] ^ t[j])
142+ return expanded
143+
144+
145+ def aes_encrypt_block (block , key ):
146+ state = list (block)
147+ w = key_expansion(key)
148+ state = add_round_key(state, w[:16 ])
149+ for round in range (1 , 10 ):
150+ state = sub_bytes(state)
151+ state = shift_rows(state)
152+ state = mix_columns(state)
153+ state = add_round_key(state, w[round * 16 :(round + 1 ) * 16 ])
154+ state = sub_bytes(state)
155+ state = shift_rows(state)
156+ state = add_round_key(state, w[160 :176 ])
157+ return bytes (state)
158+
159+
160+ # ====== 示例 ======
161+ if __name__ == " __main__" :
162+ key = b " 0123456789ABCDEF"
163+ plaintext = b " A" * 16
164+ ciphertext = aes_encrypt_block(plaintext, key)
165+ print (" Plain :" , plaintext)
166+ print (" Cipher:" , hex (u64(ciphertext[:8 ])), hex (u64(ciphertext[8 :])))
167+ ```
168+
61169``` python
62170from pwn import *
63171from aes import aes_encrypt_block
0 commit comments