二木 王者

not_a_like

拖入PE查询中看看,发现有upx壳

Untitled

用upx的程序进行脱壳,发现并不能脱去。

丢入winhex中进行查看,发现upx壳的头缺失了。

正常的

Untitled

本题的

Untitled

我们需要将其Upx头进行补全。

Untitled

然后再进行upx脱壳

脱壳后,进入ida我们可以发现许多py后缀的文件,可以判断这里为py打包为exe

我们用pyinstxtractor.py进行解包。

将struct的文件头复制到,not_a_like的文件之中,将其变成pyc文件。

然后对pyc进行反编译。

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.8

import libnum
import base64
import hashlib
from ctypes import *

def encrypt(text):
    data_xor_iv = bytearray()
    sbox = []
    j = 0
    x = y = k = 0
    key = '911dcd09ad021d68780e3efed1aa8549'
    for i in range(256):
        sbox.append(i)
    for i in range(256):
        j = j + sbox[i] + ord(key[i % len(key)]) & 255
        sbox[i] = sbox[j]
        sbox[j] = sbox[i]
    for idx in text:
        x = x + 1 & 255
        y = y + sbox[x] & 255
        sbox[x] = sbox[y]
        sbox[y] = sbox[x]
        k = sbox[sbox[x] + sbox[y] & 255]
        data_xor_iv.append(idx ^ k)
    return data_xor_iv

if __name__ == '__main__':
    flag = input('%e8%af%b7%e8%be%93%e5%85%a5flag> ')
    pub_key = [
        0x1B6A7561D99E6FC35BA3C241159424698BF3CAC017CFCE8BB325CC9AF9CBCBDB3997B08D922C8705FC3EEAEF50D60ADAB2757A7204715483A1D612502970595358BCFE9CD11C98CAD293EB921D777F4F910905D79CDCA5C1EC1FBA5DA74DB165F82BBE29EA0B2E597860FC6D2C51C12D46BF11AFA5018496DDFC3474B10B4457L,
        0x6C8E1CC5B384DE3B3316C22CF72D9895406298E172B5F4D890BDC04889BB43CD4892689DE701C84ED68B4CBC7193926BCCB0A4F259D2E752FAEF3CD590A793F120D15424AEB3CD53F5D59B5D41D699694ABF4F01532F0F1CE127B07958FB874982E757EF97643335376790BC990CEE9D7F0D05DA90AD62084C88BFA9C9BEB683L]
    m = libnum.s2n(flag)   #编码转换
    c = str(pow(m, pub_key[0], pub_key[1]))//rsa
    q = b'EeJWrgtF+5ue9MRiq7drUAFPtrLATlBZMBW2CdWHRN73Hek7DPVIYDHtMIAfTcYiEV87W7poChqpyUXYI3+/zf5yyDOyE9ARLfa5qilXggu60lmQzFqvFv+1uOaeI2hs2wx+QZtxqGZzC0VCVWvbTQ52nA2UdUtnk8VezRMPMfmf7rOqPxDTv/aacLnI3RdLG2TbT52qtN4+naejI7Xe8HLOL765OZKdDBERKwd5ARQ3UL6YPbuOKOQahIFddnIX6rZ7dTNqCUDOjfJbMdrzJVDNjmNlkLNtYFo7M65Wfwj6PV5vvtT33FsmH50/YLEasnlCiJujYOgi2KCdf5msz1dPEvrXDDL6Csnjo+6m/44RzlluzcqMS5ZJFdrHEh68LIqtu+HCO+69Dyq4e22APq8wgN9kU6R8kikXSn/Ej0N/jOvomFCbkHskRl8xP1KgWFW0SMVDlaDCM4EKG812VgDWgSYOUnVhVpz65uOtg4Z8PrPI+BW4398dQYhD24D9EIPgvtmhNrHiEHouB46ElTGQgZBhtn6y9tL1sw=='
    v = encrypt(base64.b64encode(c.encode('utf-8')))
    v = base64.b64encode(v)
    if v == q:
        print('You are right!')
        input('')
    else:
        print('winer winer winnie dinner')
        print('Do you think the encryption and decryption are the same?')

到这里了,我们直接进行逆向分析即可。

Untitled

先是将我们的flag进行rsa加密,通过搜索,我们可以知道这里属于RSA的维纳攻击

这里上传一个关于解维纳攻击比较好的工具脚本。

https://www.notion.so

进行RSA解密之后,就对我们的数据进行base64加密,对于加密后的数据传入encrypt中进行加密。

Untitled

分析encrypt我们很容易可以看出是进行RC4加密。

对rc4加密之后,然后再进行了一次base64加密。

最后再对密文进行对比。

通过这个思路,我们进行逆向解出flag即可。

 评论
目录