
안녕하십니까 코딩 파인애플입니다
이번에는 에 관해 풀어보겠습니다.
flag 형식은 DH{...}
문제 페이지에 힌트가?

어...예, 사실 모르시겠지만 방금 제목과 문제를 지나치셨습니다
...놀랍게도 저게 제목이자 문제인데
문제를 개발자 도구에서 보면

텅 비어있는... 곳에 어째서인지 다음과 같은 구문들이 있음을 알 수 있습니다
​​‌‌​&zwnj...
각각
​ → 실제 문자 U+200B
‌ → 실제 문자 U+200C
이렇게 치환되는데
유니코드 U+200B의 경우 눈에 보이지 않는 공백이지만 데이터 상의 ​라고 공간을 차지하며
유니코드 U+200C의 경우에도 글자와 글자가 서로 결합하지 않도록 강제로 떼어놓는 역할을 하는... 예, 그냥 안보이는 글 2입니다
엄연히 U+200B와 마찬가지로 데이터 상의 ‌라고 차지합니다
그렇다면 위 두 가지를 보고 알 수 있는 것은 위 문제는
제로폭 스테가노그래피를 이용한 문제임을 파악할 수 있습니다
0️⃣Zero-width Steganography
제로폭 스테가노그래피는 눈에는 거의 보이지 않는 유니코드 문자를 이용해 평범한 문장 속에 데이터를 숨기는 기법입니다
주로
U+200B : Zero Width Space
U+200C : Zero Width Non-Joiner
U+200D : Zero Width Joiner
U+FEFF : Zero Width No-Break Space
문자들이 쓰이는데
위 문자들의 공통점은 모두 '폭이 0' 입니다
즉, 폭이 0에 가까워서 겉보기에는 아무것도 안보이지만
개발자 도구를 참고하면 방금과 같이 문자열이 나열됨을 알 수 있습니다
여기서 인코더의 해석에 따라 좀 갈리는데 보편적으로는 문자 두 개를 각각 0️⃣과 1️⃣로 치환하여 데이터를 숨깁니다
위의 문제에서는 U+200B → 0, U+200C → 1 로 치환해보면
첫 번째 문장
11101100 10010111 10101100
11101010 10111000 10110000
11101100 10010111 10010000
00100000 11101100 10010111
10000110 11101100 10011101
10001100 11101100 10011010
10010100
두 번째 문장
11101101 10010101 10011000
11101100 10100111 10000000
11101011 10100111 10001100
00100000 11101101 10011110
10001100 11101101 10001010
10111000 11101011 10001010
10010100 00100000 11101100
10011110 10001000 11101100
10011101 10001100
세 번째 문장
11101100 10110101 10011100
11101100 10110100 10001000
11101100 10011101 10011000
00100000 11101011 10010011
10011100 11101011 10100110
10111100 11101101 10010101
10110101 00100000 01100011
01110100 01100110 00100000
11100011 10000100 10110100
11100011 10000101 10001001
이렇게 바이너리 코드를 8자리씩 묶은 뒤 이를 10진수로 변환하면
첫 번째 문장
7Jes6riw7JeQIOyXhuydjOyalA==
두 번째 문장
7ZWY7KeA66eMIO2ejO2KuOuKlCDsnojsnYw
세 번째 문장
7LWc7LSI7J2YIOuTnOumvO2VtSBjdGYg44S044WJ
가 되게 됩니다
이를 또 Base64로 디코딩하면
첫 번째 문장
여기에 없음요
두 번째 문장
하지만 힌트는 있음
세 번째 문장
최초의 드림핵 ctf ㄴㅉ
가 나오게 됩니다
음, 아마 ㄴㅉ는 낯짝 날짜를 말하는 것 같은데
최초의 드림핵 날짜는 2020.09.29 이므로
플래그는 DH{2020.09.29} 이 되게 됩니다
flag : DH{2020.09.29}
평가 :
