JS逆向——AES加密逆向分析

JS逆向——AES加密逆向分析

一. 分析思路

  1. networks抓包分析得到关键发送的报文
  2. ctrl+shift+f查找关键字符所在的的JS文件,实现定位js文件的功能
  3. 在js代码当中下断点进行动态调试分析,逐步分析得到加密和处理函数的流程
  4. 使用python模拟加密流程得到结果

二. 具体实现

1. 抓包分析

使用chrome浏览器得到发送的login文件报文,对应有username和password两个关键字。其中username是明文传递,而password则是使用加密后的base编码传递。

image

2. 动态分析

使用ctrl+shift+p搜索关键字password,定位到关键加密函数

image

定位到关键加密函数_etd2函数,传递的参数包括password.val()和一个salt值。下断点查看实际这两个数值是多少,password即为输入的123456,salt值则为一个确定数值。

image

继续跟踪,找到_etd2函数,调用了encryptAES函数,传递的参数为password和salt。

image

继续跟踪,找到encryptAES函数,调用了_gas函数和_rds函数,然后返回最后的加密内容。

image

_rds函数:通过随机数返回一段特定长度的字符串,字符串的内容限制为大小写字母和数字

image

_gas函数:实际加密函数,实现对于数据进行pkcs7填充,CBC模式的AES加密
image

到这里,整个加密流程已经很清晰了,下一步就是找到所有参数进行实际加密。

3. python脚本模拟加解密

动态调试得到所有参数信息

image

image

编写python脚本进行加解密:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64

def _aes_encrypt(data, key, iv):
    # AES key must be either 16, 24, or 32 bytes long
    # AES-256 is used in this example, so key must be 32 bytes
  
    cipher = AES.new(key, AES.MODE_CBC, iv)
    encrypted_data = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size))
    # Convert to base64 for safe transmission
    return base64.b64encode(encrypted_data).decode('utf-8')

def _aes_decrypt(encrypted_data, key, iv):
    # AES key must be either 16, 24, or 32 bytes long
    # AES-256 is used in this example, so key must be 32 bytes
   
    # Decode base64 first
    encrypted_data = base64.b64decode(encrypted_data)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
    return decrypted_data.decode('utf-8')

# Example usage
key0 = "z0hOHHyXMP01Bay1"  # 32 bytes key for AES-256
iv0 = "jGSmNQMxdXxFG3Sf"
data = "3ambMji4rMym3bjarYWThwx6aRcBzMwiZzneBXMXYmFW6cbM5FnGJPnJQT4fsNdp123456"
key = key0.encode('utf-8')
iv = iv0.encode('utf-8')
encrypted = _aes_encrypt(data, key, iv)
print("Encrypted:", encrypted)
decrypted = _aes_decrypt(encrypted, key, iv)
print("Decrypted:", decrypted)

运行结果如下:

image

image

加密得到的结果相同并且可成功解密,逆向结束。

posted @ 2024-06-26 20:49  ONE_ZJ  阅读(30)  评论(0编辑  收藏  举报