스터디그룹에 속한 후 처음이자, 오랜만에 경험하는 CTF였습니다.

문제들은 쉬운 편이었지만, 좀 불친절했다라고 생각이 듭니다.

웹 분야 문제들이 좀 적기도해서 재밌었지만 아쉬운 CTF 였네요.

해서 이번엔 제가 푼 총 2문제의 라이트업을 작성해 보았습니다.

 

Login Panel

첫 문제입니다.

로그인 페이지를 보여주는게 아닌 alert로 입력을 받더라고요.

 

위 문제 링크를 눌러 들어가면 사진 처럼 입력창이 나옵니다.

username과 password를 입력받고, 로그인 여부를 띄워줍니다.

세 팝업창이 끝나면 흰 화면이 남고 개발자 도구를 통해서 문제 코드를 확인 할 수 있었습니다.

<script>
    async function toHex(buffer) {
      const bytes = new Uint8Array(buffer);
      let hex = '';
      for (let i = 0; i < bytes.length; i++) {
        hex += bytes[i].toString(16).padStart(2, '0');
      }
      return hex;
    }

    async function sha256Hex(str) {
      const enc = new TextEncoder();
      const data = enc.encode(str);
      const digest = await crypto.subtle.digest('SHA-256', data);
      return toHex(digest);
    }

    function timingSafeEqualHex(a, b) {
      if (a.length !== b.length) return false;
      let diff = 0;
      for (let i = 0; i < a.length; i++) {
        diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
      }
      return diff === 0;
    }

    (async () => {
      const ajnsdjkamsf = 'ba773c013e5c07e8831bdb2f1cee06f349ea1da550ef4766f5e7f7ec842d836e'; // replace
      const lanfffiewnu = '48d2a5bbcf422ccd1b69e2a82fb90bafb52384953e77e304bef856084be052b6'; // replace

      const username = prompt('Enter username:');
      const password = prompt('Enter password:');

      if (username === null || password === null) {
        alert('Missing username or password');
        return;
      }

      const uHash = await sha256Hex(username);
      const pHash = await sha256Hex(password);

      if (timingSafeEqualHex(uHash, ajnsdjkamsf) && timingSafeEqualHex(pHash, lanfffiewnu)) {
        alert(username+ '{'+password+'}');
      } else {
        alert('Invalid credentials');
      }
    })();
  <script>

 

HTML 코드를 빼고 스크립트 코드만 가져왔습니다.

username과 password가 하드코딩 되어있고 입력값을 sha256Hex()함수에 넣어 코드의 해쉬값과 비교하여 맞으면 통과되는 문제였습니다.

sha256Hex()함수의 경우 문자열을 UTF-8로 인코딩 후 sha-256 해쉬를 계산합니다. 마무리로 16진수로 변환 후 반환해주는 함수입니다.

 

일단 해쉬를 하는 과정을 보면 솔트값을 들어가지 않았습니다.

때문에 레인보우 테이블로 찾을 수 있지 않을까 해서 해쉬 크래킹을 해주는 웹 사이트를 통해 값을 구해보기로 했습니다.

 

사이트는 "https://crackstation.net/"를 이용했습니다.

첫 문제라 그런가 다행히 바로 성공했습니다.

username은 v1t라는 것을 구했네요.

password 역시 바로 구하는데 성공했습니다.

해서 이제 문제로 돌아가서 username에 v1t, password에 p4ssw0rd를 입력하면

이렇게 플래그를 획득 할 수 있습니다.

FLAG = v1t{p4ssw0rd}

 

Stylish Flag

두 번째 문제입니다.

싫어요가 좀 많은 문제더라고요.

 

문제 링크를 누르면 바로 이런 화면으로 넘어갑니다.

개발자 도구부터 봐줬습니다. 그런데..

    body {
        background: #111;
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
    }

    h1 {
        font-size: 100px;
        color: #0f0;
    }

    .flag {
        width: 8px;
        height: 8px;
        background: #0f0;
        transform: rotate(180deg);
        opacity: 0.05;
        box-shadow:
            264px 0px #0f0,
            1200px 0px #0f0,
            0px 8px #0f0,
            32px 8px #0f0,
            88px 8px #0f0,
            96px 8px #0f0,
            160px 8px #0f0,
            168px 8px #0f0,
            176px 8px #0f0,
            184px 8px #0f0,
            192px 8px #0f0,
            256px 8px #0f0,
            320px 8px #0f0,
            344px 8px #0f0,
            408px 8px #0f0,
            416px 8px #0f0,
            480px 8px #0f0,
            488px 8px #0f0,
            496px 8px #0f0,
            560px 8px #0f0,
            568px 8px #0f0,
            576px 8px #0f0,
            640px 8px #0f0,
            648px 8px #0f0,
            656px 8px #0f0,
            712px 8px #0f0,
            720px 8px #0f0,
            736px 8px #0f0,
            744px 8px #0f0,
            792px 8px #0f0,
            800px 8px #0f0,
            808px 8px #0f0,
            816px 8px #0f0,
            824px 8px #0f0,
            960px 8px #0f0,
            968px 8px #0f0,
            976px 8px #0f0,
            1040px 8px #0f0,
            1048px 8px #0f0,
            1056px 8px #0f0,
            1112px 8px #0f0,
            1120px 8px #0f0,
            1128px 8px #0f0,
            1136px 8px #0f0,
            1200px 8px #0f0,
            1208px 8px #0f0,
            0px 16px #0f0,
            8px 16px #0f0,
            24px 16px #0f0,
            32px 16px #0f0,
            80px 16px #0f0,
            88px 16px #0f0,
            96px 16px #0f0,
            104px 16px #0f0,
            168px 16px #0f0,
            176px 16px #0f0,
            248px 16px #0f0,
            256px 16px #0f0,
            320px 16px #0f0,
            344px 16px #0f0,
            400px 16px #0f0,
            408px 16px #0f0,
            416px 16px #0f0,
            480px 16px #0f0,
            504px 16px #0f0,
            576px 16px #0f0,
            584px 16px #0f0,
            640px 16px #0f0,
            656px 16px #0f0,
            664px 16px #0f0,
            712px 16px #0f0,
            720px 16px #0f0,
            736px 16px #0f0,
            744px 16px #0f0,
            808px 16px #0f0,
            952px 16px #0f0,
            960px 16px #0f0,
            1032px 16px #0f0,
            1040px 16px #0f0,
            1112px 16px #0f0,
            1200px 16px #0f0,
            1208px 16px #0f0,
            0px 24px #0f0,
            8px 24px #0f0,
            24px 24px #0f0,
            32px 24px #0f0,
            96px 24px #0f0,
            104px 24px #0f0,
            168px 24px #0f0,
            176px 24px #0f0,
            248px 24px #0f0,
            256px 24px #0f0,
            320px 24px #0f0,
            328px 24px #0f0,
            336px 24px #0f0,
            344px 24px #0f0,
            408px 24px #0f0,
            416px 24px #0f0,
            480px 24px #0f0,
            504px 24px #0f0,
            576px 24px #0f0,
            632px 24px #0f0,
            640px 24px #0f0,
            656px 24px #0f0,
            664px 24px #0f0,
            712px 24px #0f0,
            720px 24px #0f0,
            736px 24px #0f0,
            744px 24px #0f0,
            808px 24px #0f0,
            952px 24px #0f0,
            1032px 24px #0f0,
            1040px 24px #0f0,
            1112px 24px #0f0,
            1120px 24px #0f0,
            1200px 24px #0f0,
            1208px 24px #0f0,
            8px 32px #0f0,
            24px 32px #0f0,
            96px 32px #0f0,
            104px 32px #0f0,
            168px 32px #0f0,
            176px 32px #0f0,
            240px 32px #0f0,
            248px 32px #0f0,
            320px 32px #0f0,
            328px 32px #0f0,
            336px 32px #0f0,
            344px 32px #0f0,
            408px 32px #0f0,
            416px 32px #0f0,
            480px 32px #0f0,
            504px 32px #0f0,
            568px 32px #0f0,
            576px 32px #0f0,
            584px 32px #0f0,
            632px 32px #0f0,
            640px 32px #0f0,
            648px 32px #0f0,
            664px 32px #0f0,
            712px 32px #0f0,
            720px 32px #0f0,
            736px 32px #0f0,
            744px 32px #0f0,
            808px 32px #0f0,
            952px 32px #0f0,
            1048px 32px #0f0,
            1056px 32px #0f0,
            1120px 32px #0f0,
            1128px 32px #0f0,
            1136px 32px #0f0,
            1208px 32px #0f0,
            1216px 32px #0f0,
            8px 40px #0f0,
            16px 40px #0f0,
            24px 40px #0f0,
            96px 40px #0f0,
            104px 40px #0f0,
            168px 40px #0f0,
            176px 40px #0f0,
            248px 40px #0f0,
            256px 40px #0f0,
            320px 40px #0f0,
            344px 40px #0f0,
            408px 40px #0f0,
            416px 40px #0f0,
            480px 40px #0f0,
            504px 40px #0f0,
            576px 40px #0f0,
            584px 40px #0f0,
            640px 40px #0f0,
            664px 40px #0f0,
            712px 40px #0f0,
            720px 40px #0f0,
            736px 40px #0f0,
            744px 40px #0f0,
            808px 40px #0f0,
            952px 40px #0f0,
            960px 40px #0f0,
            1056px 40px #0f0,
            1064px 40px #0f0,
            1136px 40px #0f0,
            1200px 40px #0f0,
            1208px 40px #0f0,
            8px 48px #0f0,
            16px 48px #0f0,
            24px 48px #0f0,
            88px 48px #0f0,
            96px 48px #0f0,
            104px 48px #0f0,
            112px 48px #0f0,
            168px 48px #0f0,
            176px 48px #0f0,
            248px 48px #0f0,
            256px 48px #0f0,
            320px 48px #0f0,
            344px 48px #0f0,
            400px 48px #0f0,
            408px 48px #0f0,
            416px 48px #0f0,
            424px 48px #0f0,
            480px 48px #0f0,
            488px 48px #0f0,
            496px 48px #0f0,
            560px 48px #0f0,
            568px 48px #0f0,
            576px 48px #0f0,
            640px 48px #0f0,
            648px 48px #0f0,
            656px 48px #0f0,
            664px 48px #0f0,
            720px 48px #0f0,
            728px 48px #0f0,
            736px 48px #0f0,
            808px 48px #0f0,
            960px 48px #0f0,
            968px 48px #0f0,
            976px 48px #0f0,
            1032px 48px #0f0,
            1040px 48px #0f0,
            1048px 48px #0f0,
            1056px 48px #0f0,
            1112px 48px #0f0,
            1120px 48px #0f0,
            1128px 48px #0f0,
            1136px 48px #0f0,
            1200px 48px #0f0,
            1208px 48px #0f0,
            248px 56px #0f0,
            256px 56px #0f0,
            1200px 56px #0f0,
            1208px 56px #0f0,
            256px 64px #0f0,
            264px 64px #0f0,
            872px 64px #0f0,
            880px 64px #0f0,
            888px 64px #0f0,
            896px 64px #0f0,
            904px 64px #0f0,
            1192px 64px #0f0,
            1200px 64px #0f0;
    }

 

이런 엄청 수상한 CSS 파일이 있었습니다.

각 px들이 좌표를 나타내는구나 라고 예상해서 클로드 한테 각 좌표에 맞게 도트를찍어 달라했습니다.

 

좌표에 맞게 도트를 찍으니 이런 플래그가 나오더군요.

처음엔 저 동그란 글자가 0인지 O인지 헷갈렸는데, 중간에 줄 처럼 그어진게 숫자를 나타내는거 같아서 0으로 적어냈더니 통과가 되었습니다.

뭔가 슴슴한 문제였네요.

 

FLAG = v1t{H1D30UT_CSS}

 

 

'보안 > CTF' 카테고리의 다른 글

[0xFUN CTF 2026] Web write-up  (0) 2026.02.15
[CubeCTF] Web - Legal Snacks write-up  (0) 2025.07.07

+ Recent posts