Hashish
아래 함수 결과에 해당하는 결과 값을 파일로 제공해 준다.
__int64 __fastcall genhash(char *input)
{
unsigned int v1; // eax
char *v2; // rax
__int64 input_byte; // rax
char *v4; // [rsp+8h] [rbp-18h]
unsigned int count; // [rsp+14h] [rbp-Ch]
signed __int64 v6; // [rsp+18h] [rbp-8h]
v4 = input;
v6 = 13LL;
count = 0;
while ( 1 )
{
v2 = v4++;
input_byte = (unsigned int)*v2;
if ( !(_DWORD)input_byte )
break;
v6 = 3 * v6 + (signed int)input_byte;
v1 = count++;
printf("hash-%d : %ld\n", v1, v6);
}
return input_byte;
}
hash.txt
hash-0 : 138
hash-1 : 512
hash-2 : 1645
hash-3 : 5034
hash-4 : 15218
hash-5 : 45756
hash-6 : 137391
hash-7 : 412292
hash-8 : 1236927
hash-9 : 3710845
hash-10 : 11132642
hash-11 : 33398021
hash-12 : 100194167
hash-13 : 300582553
hash-14 : 901747774
hash-15 : 2705243426
hash-16 : 8115730373
hash-17 : 24347191171
hash-18 : 73041573621
hash-19 : 219124720917
hash-20 : 657374162799
hash-21 : 1972122488522
hash-22 : 5916367465576
위 로직에 맞게 역연산 해주면 된다.
solve.py
hash = [13,138,512,1645,5034,15218,45756,137391,412292,1236927,3710845,11132642,33398021,100194167,300582553,901747774,2705243426,8115730373,24347191171,73041573621,219124720917,657374162799,1972122488522,5916367465576]
flag = ""
for i in xrange(len(hash)):
if i==len(hash)-1:
break
flag += chr(hash[i+1]-(3*hash[i]))
print flag
cryptoware
암호화된 파일을 하나 주는데 복호화 하면 된다.
암호화 코드를 보면 시드 값이 고정이 안되있어서 암호화 시 사용한 xor값을 알 수가 없다. 근데 잘 보면 키 값이 0~127 까지밖에 안되서 그냥 brute force 해주며 된다.
encrypt function
__int64 __fastcall encrypt(char *input)
{
unsigned int v1; // eax
int v2; // eax
__int64 v3; // rdx
_QWORD *v4; // rax
__int64 v5; // rdx
__int64 v6; // rax
char v8; // [rsp+10h] [rbp-17C0h]
char v9; // [rsp+210h] [rbp-15C0h]
__int64 v10; // [rsp+310h] [rbp-14C0h]
char input_2[5010]; // [rsp+420h] [rbp-13B0h]
char input_1; // [rsp+17B2h] [rbp-1Eh]
char v13; // [rsp+17B3h] [rbp-1Dh]
int v14; // [rsp+17B4h] [rbp-1Ch]
int j; // [rsp+17B8h] [rbp-18h]
int i; // [rsp+17BCh] [rbp-14h]
v1 = time(0LL);
srand(v1);
v2 = rand() % 95;
v14 = v2 + 32;
v13 = v2 + 32;
std::basic_ifstream<char,std::char_traits<char>>::basic_ifstream(&v9);
std::basic_ifstream<char,std::char_traits<char>>::open(&v9, input, 8LL);
if ( (unsigned __int8)std::basic_ios<char,std::char_traits<char>>::operator!(&v10) )
{
std::operator<<<std::char_traits<char>>(&std::cerr, "File not found", v3);
exit(1);
}
for ( i = 0; ; ++i )
{
v4 = (_QWORD *)std::operator>><char,std::char_traits<char>>(&v9, &input_1);
if ( !(unsigned __int8)std::basic_ios<char,std::char_traits<char>>::operator bool((char *)v4 + *(_QWORD *)(*v4 - 24LL)) )
break;
input_2[i] = input_1;
}
std::basic_ifstream<char,std::char_traits<char>>::close(&v9);
v6 = std::operator<<<std::char_traits<char>>(&std::cout, input_2, v5);
std::ostream::operator<<(v6, &MEMORY[0x7FB33BCF6B70]);
std::basic_ofstream<char,std::char_traits<char>>::basic_ofstream(&v8, input, 16LL);
for ( j = 0; j < i; ++j )
std::operator<<<std::char_traits<char>>(&v8, (unsigned int)(char)(v13 ^ input_2[j]));
std::basic_ofstream<char,std::char_traits<char>>::close(&v8);
std::basic_ofstream<char,std::char_traits<char>>::~basic_ofstream(&v8);
return std::basic_ifstream<char,std::char_traits<char>>::~basic_ifstream(&v9);
}
solve.py
enc_string = """.CNsdyD[NYJ_DYBXNS_YNFNGRHDFFDEJXJHDF[DENE_BEFDYNHDF[GNSHB[CNYX.iRB_XNGM.^XBELJHDEX_JE_YN[NJ_BEL@NR.JXBF[GNsdyHB[CNYHJE_YB]BJGGRINIYD@NE^XBELMYNZ^NEHRJEJGRXBX.bM_CNHDE_NE_DMJERFNXXJLNHJEINL^NXXNODYD_CNY\BXN@ED\E_CNE_CN@NRHJEINYN]NJGNO.b_X[YBFJYRFNYB_BX_CJ_B_BXXBF[GN_DBF[GNFNE_.JEO_CJ__CNsdyD[NYJ_BDEBXHDF[^_J_BDEJGGRBENS[NEXB]N.jXBF[GNYN[NJ_BELsdy.B.N.^XBEL_CNXJFN@NRMDYSDYD[NYJ_BDEDE_CN\CDGNOJ_J.HB[CNYBX_CNYNMDYNXDFN_BFNX^XNOMDYCBOBELBEMDYFJ_BDEBEHJXNX\CNYNED[JY_BH^GJYXNH^YB_RBXYNZ^BYNO.iR_CN\JRMGJLBXHIFH_MPXCNODED_@ED\JID^_YN]NYXBELV"""
dec_string = ""
for i in xrange(128):
dec_string = ""
for j in xrange(len(enc_string)):
dec_string += chr(ord(enc_string[j])^i)
if "cbmctf" in dec_string:
index = dec_string.find("cbmctf")
print dec_string[index:]
Long road
cool[넘버] 페이지 Brute Force해주면 플래그 나오는 페이지가 있다.
In mountains I feel fresh
페이지 요청할때 마다 세션값이 다시 세팅되는데 이거 파싱해서 다음 페이지 요청할때 세션 값 재 세팅해주는 식으로 Brute Force 해주면 된다.
solve.py
import requests
def request(cookie):
url = "http://cbmctf2019.cf:5001/"
headers = {'Cookie': 'session=' + cookie}
response = requests.get(url, headers=headers)
if "cbmctf" in response.text:
print response.text
return response.headers['Set-Cookie'].replace("session=","").replace("; HttpOnly; Path=/","")
cookie = "eyJ2aXNpdHMiOjUwfQ.XKn_Hg.nLw94DRaPh2xkEeMUuApvcihnBo"
for i in range(0,1000):
cookie = request(cookie)
print cookie