CBM CTF 2019 Writeup

CTF/Writeup 2019. 4. 8. 01:21

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


'CTF > Writeup' 카테고리의 다른 글

Byte Bandits CTF 2019 Web Writeup  (0) 2019.04.14
Midnight Sun CTF 2019 Quals Rubenscube  (0) 2019.04.08
Midnightsun CTF 2019 Marcodowno  (0) 2019.04.07
Radar CTF 2019 Inj3c7  (0) 2019.04.05
Encrypt CTF 2019 Write up  (0) 2019.04.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,