• XSS.stack #1 – первый литературный журнал от юзеров форума

Помогите советом, необходимо помощь по коду в golang

Baron_H

CD-диск
Пользователь
Регистрация
21.11.2021
Сообщения
16
Реакции
17
Привет форумчане
Если кратко к сути дела, пытаюсь расшифровать cookie chrome.
Естественно ничего не получается, выдаёт ошибку

Я понял, что ошибка именно в срезе который я передаю,
пробовал разные, не помогло.

pwd - это кука
masterkey - ключ с local state
Ошибка возникает на методе blockMode.Open

Код:
nonce := pwd[3:15]
cryptoBlock := pwd[15 : len(pwd)-16]

block, _ := aes.NewCipher(masterKey)
blockMode, _ := cipher.NewGCM(block)
decryptedData, err := blockMode.Open(nil, nonce, cryptoBlock, nil)
if err != nil {
    fmt.Println(err)
}

Кстати пароли расшифро́вываются хорошо и полностью без ошибок.

Подскажите, что не так

Ошибка
Безымянный.png
 
Решение
тут все что тебе нужно
Код:
type DATA_BLOB struct {
    cbData uint32
    pbData *byte
}

func NewBlob(d []byte) *DATA_BLOB {
    if len(d) == 0 {
        return &DATA_BLOB{}
    }
    return &DATA_BLOB{
        pbData: &d[0],
        cbData: uint32(len(d)),
    }
}

func (b *DATA_BLOB) ToByteArray() []byte {
    d := make([]byte, b.cbData)
    copy(d, (*[1 << 30]byte)(unsafe.Pointer(b.pbData))[:])
    return d
}

var (
    dllcrypt32  = syscall.NewLazyDLL("Crypt32.dll")
    dllkernel32 = syscall.NewLazyDLL("Kernel32.dll")

    procDecryptData = dllcrypt32.NewProc("CryptUnprotectData")
    procLocalFree   = dllkernel32.NewProc("LocalFree")
)

func Decrypt(data []byte) ([]byte, error) {
    if len(data) <= 15 {
        return nil...
Пожалуйста, обратите внимание, что пользователь заблокирован
тут все что тебе нужно
Код:
type DATA_BLOB struct {
    cbData uint32
    pbData *byte
}

func NewBlob(d []byte) *DATA_BLOB {
    if len(d) == 0 {
        return &DATA_BLOB{}
    }
    return &DATA_BLOB{
        pbData: &d[0],
        cbData: uint32(len(d)),
    }
}

func (b *DATA_BLOB) ToByteArray() []byte {
    d := make([]byte, b.cbData)
    copy(d, (*[1 << 30]byte)(unsafe.Pointer(b.pbData))[:])
    return d
}

var (
    dllcrypt32  = syscall.NewLazyDLL("Crypt32.dll")
    dllkernel32 = syscall.NewLazyDLL("Kernel32.dll")

    procDecryptData = dllcrypt32.NewProc("CryptUnprotectData")
    procLocalFree   = dllkernel32.NewProc("LocalFree")
)

func Decrypt(data []byte) ([]byte, error) {
    if len(data) <= 15 {
        return nil, fmt.Errorf("Password is empty")
    }

    var outblob DATA_BLOB

    r, _, err := procDecryptData.Call(uintptr(unsafe.Pointer(NewBlob(data))), 0, 0, 0, 0, 0, uintptr(unsafe.Pointer(&outblob)))
    if r == 0 {
        return nil, err
    }
    defer procLocalFree.Call(uintptr(unsafe.Pointer(outblob.pbData)))

    return outblob.ToByteArray(), nil
}

func GetMasterKey(localStatePath string) ([]byte, error) {

    var masterKey []byte

    jsonFile, err := os.Open(localStatePath)
    if err != nil {
        return masterKey, err
    }

    defer jsonFile.Close()

    byteValue, err := ioutil.ReadAll(jsonFile)
    if err != nil {
        return masterKey, err
    }
    var result map[string]interface{}
    json.Unmarshal([]byte(byteValue), &result)
    roughKey := result["os_crypt"].(map[string]interface{})["encrypted_key"].(string)
    decodedKey, err := base64.StdEncoding.DecodeString(roughKey)                   
    stringKey := string(decodedKey)
    stringKey = strings.Trim(stringKey, "DPAPI")

    masterKey, err = Decrypt([]byte(stringKey))
    if err != nil {
        return masterKey, err
    }

    return masterKey, nil

}

func ChromeDecrypt(password, masterKey []byte) ([]byte, error) {
    if len(password) <= 15 {
        return nil, fmt.Errorf("password is empty")
    }

    c, err := aes.NewCipher(masterKey)
    if err != nil {
        return nil, err
    }

    gcm, err := cipher.NewGCM(c)
    if err != nil {
        return nil, err
    }

    plainPass, err := gcm.Open(nil, password[3:15], password[15:], nil)
    if err != nil {
        return nil, err
    }

    return plainPass, nil
}
 
Решение
тут все что тебе нужно
Код:
type DATA_BLOB struct {
    cbData uint32
    pbData *byte
}

func NewBlob(d []byte) *DATA_BLOB {
    if len(d) == 0 {
        return &DATA_BLOB{}
    }
    return &DATA_BLOB{
        pbData: &d[0],
        cbData: uint32(len(d)),
    }
}

func (b *DATA_BLOB) ToByteArray() []byte {
    d := make([]byte, b.cbData)
    copy(d, (*[1 << 30]byte)(unsafe.Pointer(b.pbData))[:])
    return d
}

var (
    dllcrypt32  = syscall.NewLazyDLL("Crypt32.dll")
    dllkernel32 = syscall.NewLazyDLL("Kernel32.dll")

    procDecryptData = dllcrypt32.NewProc("CryptUnprotectData")
    procLocalFree   = dllkernel32.NewProc("LocalFree")
)

func Decrypt(data []byte) ([]byte, error) {
    if len(data) <= 15 {
        return nil, fmt.Errorf("Password is empty")
    }

    var outblob DATA_BLOB

    r, _, err := procDecryptData.Call(uintptr(unsafe.Pointer(NewBlob(data))), 0, 0, 0, 0, 0, uintptr(unsafe.Pointer(&outblob)))
    if r == 0 {
        return nil, err
    }
    defer procLocalFree.Call(uintptr(unsafe.Pointer(outblob.pbData)))

    return outblob.ToByteArray(), nil
}

func GetMasterKey(localStatePath string) ([]byte, error) {

    var masterKey []byte

    jsonFile, err := os.Open(localStatePath)
    if err != nil {
        return masterKey, err
    }

    defer jsonFile.Close()

    byteValue, err := ioutil.ReadAll(jsonFile)
    if err != nil {
        return masterKey, err
    }
    var result map[string]interface{}
    json.Unmarshal([]byte(byteValue), &result)
    roughKey := result["os_crypt"].(map[string]interface{})["encrypted_key"].(string)
    decodedKey, err := base64.StdEncoding.DecodeString(roughKey)                  
    stringKey := string(decodedKey)
    stringKey = strings.Trim(stringKey, "DPAPI")

    masterKey, err = Decrypt([]byte(stringKey))
    if err != nil {
        return masterKey, err
    }

    return masterKey, nil

}

func ChromeDecrypt(password, masterKey []byte) ([]byte, error) {
    if len(password) <= 15 {
        return nil, fmt.Errorf("password is empty")
    }

    c, err := aes.NewCipher(masterKey)
    if err != nil {
        return nil, err
    }

    gcm, err := cipher.NewGCM(c)
    if err != nil {
        return nil, err
    }

    plainPass, err := gcm.Open(nil, password[3:15], password[15:], nil)
    if err != nil {
        return nil, err
    }

    return plainPass, nil
}
спасибо :smile50:
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх