Jaeseo's Information Security Story

RITSEC CTF 2019 - WriteUp - 999 Bottles 본문

Write UP/RITSEC CTF 2019

RITSEC CTF 2019 - WriteUp - 999 Bottles

Jaeseokim 2019. 11. 25. 08:28

999 Bottles

문제구분 난이도 작성자
PWN JaeSeoKim

문제 내용

문제 풀이

일단 999개의 ELF파일중 하나를 IDA로 통해 한번 열어봅니다.

int __cdecl main(int argc, const char **argv, const char **envp) 
{ 
  char v4; // [esp+Bh] [ebp-Dh] 
  unsigned int v5; // [esp+Ch] [ebp-Ch] 

  v5 = __readgsdword(0x14u); 
  /* 
  ...................안쓰는 변수 생략................. 
  */ 
  p = 70; 

  puts("What is my character?"); 
  __isoc99_scanf("%c", &v4); 
  if ( v4 == p ) 
    puts("OK!"); 
  else 
    puts("Nope!\r"); 
  return 0; 
} 

프로그램을 보면 ascii코드와 비교를 해서 맞는 값이면 Ok!라고 알려주는 모습을 볼 수 있습니다. 그렇다면 이 999개의 프로그램 전부를 하나씩 리버싱을 통해 풀어내는 것은 매우 비효율 적인 일이라고 할 수 있으니 BruteForce공격을 이용하여 Ok!라고 나올때마다 단어를 저장하도록 하는 스크립트를 작성해봅니다.

import subprocess 

def BureteForce(file): 
    for i in range(33,128): 
        proc = subprocess.run([file], input=chr(i).encode('ascii'), stdout=subprocess.PIPE) 
        if "OK!" in proc.stdout.decode(): 
            return chr(i) 
    return None 

if __name__ == '__main__': 
    flag = "" 
    for i in range(1,1000): 
        file = "./{:03d}.c.out".format(i) 
        print("trying : "+file) 
        flag += BureteForce(file) 
    print("flag : \n"+flag) 

결과물을 봅니다!

flag :  
F")|/f,:PsUUmKL*z(;N`QPtDZvX@j~=]q)AJ$w#g|Kehk)_$D_k;ESDz@ZK#=ZWfCo[GYG;FQ`W"mhoPlhr#W"N=RUxzjh"}&PJWWE@Jh%vKEIey`h,Xvxnsce/oqb,&*{#o&gMe-:RbSJO*>QIicbo<[sm>rmT@$@MgEwi:t{;U$WU[wRI!]+l[ngTqU>W:W*)$Sb},PmyEdJ~puK^zk!y.]M].vnBl!.OECe=JDiM|n+RihaL"x_p@M^P!f<Pa*j,A#"-,_n+z[?-bsQ.LBc{r<xR$[vuA/vMq%/_f-Yqg#$V}y&}[ReHU,`{^L/?rQlEW:Tv&l|&Ac#=FgrQR@a[Awwh-EEK@L:xf`M@E&}VFOZo:]ObRyiAomKD|,=pErk)wr%ir!J+`.DkN_`k>D}yrZ^@J&,qIRo|dvY+m@o:{cBvSE:G<;lGzV?NwpG*`VMnqSdXjN:r#=`=qq[qsn_kih>|M|WzEfz^|J>GTEc~k=KEbr@xOrP}iQnw#-uO-/]iCmbtBV+N*CmUiWl;STEf@}oB!e*!K#wmg](w.P]jm_o;Qec"AVm}JA#ua=hptzPVH?MSbopjRYUzDL_[[pA[)huW;=mhbIPAibwC[?o!"t.uKy[o~NiG;B=T.Rrn&OrF:&J&Xf`lr^wN${HnW<DtVjk.RITSEC{AuT057v}^W!xT;ImOU;ruPEQJKtRPlL#aGA.[PX,;,e~$t:*^dR?P_daEe,_{#r+iNrE-UVdeQh]GiIO+G;*.m=&+g#x|P!oXA(iFm({ZgTIohA<,.e(&KWw|>~,Wl<XH]<zT|H;gl.I_n"JAJ=n&}KJV{wsIFgsGHv@)+kj&>AQ~%xxK}<D?V+~oD?p=IZ$,Uy:L}$d[*VboIFrUuxp{{U!&e}-MSFDal(dIp^dN]D_`DYi!$VpNB-ZCUYKVxXta$Ur*!kSN`k>#fOzg]"ERlSIE~g)YlRi^oZg*Y,|ODGgbrXoqljJzChJ"c+ZRjy]}f{e 

간단하게 ctr+f 를 통해 RITSEC를 검색 하면 Flag를 발견할 수 있습니다.

RITSEC{AuT057v}

 

참고 포인트

  • python subprocess 라이브러리 이용
  • brute force 공격 사용
Comments