보안
2024-08-31
1분 읽기

2024 Codegate Open CTF Write Up

Codegate Open CTF Write Up (Web2, Rev1, Misc1)

1. Shopping Mall(web)

  • 로그인 기능이 존재하고, 구매 목록이 하단에 뜨는 쇼핑몰 사이트
  • 로그인창에 인젝션공격(admin' #)
  • 구매목록에 플래그 출력
  • flag: codegate2024{36a271873875eaea1f270df5284eb4eb668b73c96ca3f80303414ffb23e163f8}

2. genesisCrack(rev)

  • 입력값이 인증 키 값과 같다면 Success, 틀리면 경고창을 출력하는 exe 프로그램
  • IDA로 분석, 바로 if문으로 입력값과 인증 키를 비교중(flag = 인증 키 값)
    int __fastcall __noreturn main(int argc, const char **argv, const char **envp)
    {
      __int64 v3; // rax
      char v4[32]; // [rsp+20h] [rbp-38h] BYREF
    
      sub_140001020("  ______ _______ __   _ _______ _______ _____ _______\n");
      sub_140001020(" |  ____ |______ | \\  | |______ |______   |   |______\n");
      sub_140001020(" |_____| |______ |  \\_| |______ ______| __|__ ______|\n");
      sub_140001020("\nWelcome to 2024 CODEGATE OpenCTF\n");
      sub_140001020("\n");
      sub_140001020("Enter the 10-digit key: ");
      sub_140001080("%10s");
      v3 = 0i64;
      strcpy(v4, "3502214347");
      while ( v4[v3 + 16] == v4[v3] )
      {
        if ( ++v3 >= 10 )
        {
          sub_140001020("Auth Success!\n");
          Sleep(0x7D0u);
          exit(1);
        }
      }
      MessageBoxW(0i64, L"Auth Fail", L"Authentication", 0x10u);
      Sleep(0xBB8u);
      exit(1);
    }
    
  • flag: codegate2024{3502214347}

3. Gary the Snail(web)

  • command 인젝션 취약점이 존재하는 사이트(get요청으로 count값을 받는데 검증없이 command구문으로 삽입)
  • ?count=1; cat flag.txt를 입력해 보았으나 502.. 계속 시도해보니 ping -c {count} 8.8.8.8 형식으로 되어있어 echo같은 명령어가 아니면 구문 자체에 에러가 나는 것
  • ?count=1; ls; echo로 디렉토리 구조 확인 -> flag가 없어 상위 디렉토리로 이동 -> 없어서 cd .. 3번감 -> flag-Yv2bc2i6.txt 파일 발견 -> cat 명령어로 읽기
  • 최종공격구문: ?count=1;%20cd%20..;%20cd%20..;%20cd%20..;%20cat%20flag-Yv2bc2i6.txt;%20echo
  • flag: codegate2024{75d6154bcacaebb3814d05253ed17fdb749fd0645e30349e1506c808b5d3d165}

4. Fool Calculator(misc)

  • time out이 굉장히 빠른 계산 문제
    from pwn import *
    import re
    
    HOST = '3.34.195.42'
    PORT = 1337
    
    def main():
        p = remote(HOST, PORT)
        p.recvuntil(b'[+] AI Answer: ')
        
        ai_answer = int(p.recvline().strip())
        log.info(f'AI Answer: {ai_answer}')
      
        def generate_expression(answer):
            x = answer // 2
            y = answer - x
            return f'{x}+{y}'
      
        expression = generate_expression(ai_answer)
        log.info(f'Generated Expression: {expression}')
      
    
        p.sendline(expression)
        result = p.recvall().decode()
        log.info(result)
    
    if __name__ == "__main__":
        main()
    
  • python코드를 작성하여 문제 해결
    C:\Users\admin\Desktop\test.py:32: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
      p.sendline(expression)
    [x] Receiving all data
    [x] Receiving all data: 33B
    [x] Receiving all data: 70B
    [x] Receiving all data: 195B
    [x] Receiving all data: 227B
    
    [+] Receiving all data: Done (227B)
    [*] Closed connection to 3.34.195.42 port 1337
    [*] --------------------------------
        [*] Fool equation: 10088630+10088631
        [*] Fool Answer: 20177261
        [+] Success, FLAG: codegate2024{e6d973fed0a3cf09af6a040cdf89c0bec7a2e601838b1f80584bdd947e540090}
    
        Time is up! Closing connection.
    
  • flag: codegate2024{e6d973fed0a3cf09af6a040cdf89c0bec7a2e601838b1f80584bdd947e540090}

후기

codegate-openctf 최종적으로 1760점을 획득하며 8등으로 마무리를 지었습니다.
전반적으로 어렵지 않은 난이도로 시간날때 재미있게 풀 수 있었던 문제들이었습니다.