buuctf re [FlareOn4]IgniteMe
阿新 • • 發佈:2021-12-20
無殼32位
void __noreturn start() { DWORD NumberOfBytesWritten; // [esp+0h] [ebp-4h] BYREF NumberOfBytesWritten = 0; hFile = GetStdHandle(0xFFFFFFF6); dword_403074 = GetStdHandle(0xFFFFFFF5); WriteFile(dword_403074, aG1v3M3T3hFl4g, 0x13u, &NumberOfBytesWritten, 0); sub_4010F0(); if ( sub_401050() ) WriteFile(dword_403074, aG00dJ0b, 0xAu, &NumberOfBytesWritten, 0); else WriteFile(dword_403074, aN0tT00H0tRWe7r, 0x24u, &NumberOfBytesWritten, 0); ExitProcess(0); }
就兩個函式 一個sub_4010F0() 一個sub_401050()
檢視sub_4010F0()
int sub_4010F0() { unsigned int v0; // eax char Buffer[260]; // [esp+0h] [ebp-110h] BYREF DWORD NumberOfBytesRead; // [esp+104h] [ebp-Ch] BYREF unsigned int i; // [esp+108h] [ebp-8h] char v5; // [esp+10Fh] [ebp-1h] v5 = 0; for ( i = 0; i < 0x104; ++i ) Buffer[i] = 0; ReadFile(hFile, Buffer, 0x104u, &NumberOfBytesRead, 0); for ( i = 0; ; ++i ) { v0 = sub_401020((int)Buffer); if ( i >= v0 ) break; v5 = Buffer[i]; if ( v5 != 10 && v5 != 13 ) { if ( v5 ) byte_403078[i] = v5; } } return 1; }
發現就是 v5 != 10 && v5 != 13 也就是/n /r排除
檢視sub_401050()
int sub_401050() { int v1; // [esp+0h] [ebp-Ch] int i; // [esp+4h] [ebp-8h] unsigned int j; // [esp+4h] [ebp-8h] char v4; // [esp+Bh] [ebp-1h] v1 = sub_401020((int)byte_403078); v4 = sub_401000(); for ( i = v1 - 1; i >= 0; --i ) { byte_403180[i] = v4 ^ byte_403078[i]; v4 = byte_403078[i]; } for ( j = 0; j < 0x27; ++j ) { if ( byte_403180[j] != (unsigned __int8)byte_403000[j] ) return 0; } return 1; }
sub_401050函式就是將字串逆向做了異或操作之後,與已知字串byte_403000對比
v4就是
__int16 sub_401000()
{
return (unsigned __int16)__ROL4__(-2147024896, 4) >> 1;
}
那麼檢視wp大家都說是4 可以進入OD檢視當前函式返回值
byte_403000=[0x0D,0x26,0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C, 0x5D,0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44, 0x6F, 0x6E, 0x56, 0x9,0x5F, 0x45, 0x47, 0x73, 0x26, 0x0A, 0x0D, 0x13, 0x17, 0x48, 0x42,0x1, 0x40, 0x4D, 0x0C, 0x2, 0x69, 0x0]
flag=""
L=len(byte_403000)-1
for i in range(len(byte_403000)):
if i==0:
byte_403000[L-i]= byte_403000[L-i]^0x4
byte_403000[L-i-1] = byte_403000[L-i-1]^byte_403000[L-i]
for i in byte_403000:
flag+=chr(i)
print ("flag{"+flag+"}")