
스터디그룹에 속한 후 처음이자, 오랜만에 경험하는 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 |