"그래서 이걸 나중에 어떤 타입으로 형변환하느냐에 따라 메모리를 읽어 들이는 단위가 달라지는 거고..."
선생님의 수업 내용은 머리에 전혀 들어오지 않았다. 오늘 밤새 워게임을 풀다가 3시간밖에 못 잔 탓인지, 내 의식은 금방이라도 꺼질 것처럼 희미했다. 아니, 사실은 풀지도 못했다.
마음 같아서는 당장 눈앞의 컴퓨터로 문제를 풀고 싶었지만, 학교 컴퓨터실에는 워게임을 풀 만한 세팅이 되어 있지 않았기에 단념할 수 밖에 없었다. WSL2조차 없는 게 말이 되냐고. 사실 그건 핑계고, 그냥 너무 피곤했다.
"...그래서 이게 원리상으로는 맞는데, 솔직히 말해서 여러분 나중에 취업하면 이런 거 직접 짤 일은 생각보다 별로 없을 겁니다."
이곳은 화성차세대정보고등학교.
이름에서 알 수 있다시피, 경기도 화성시에 위치한 IT 특성화 고등학교다. 입학한 지 세 달이 되어 느끼는 것은, 급식 하나만큼은 상당히 괜찮은 편이다.
'아.. 죽겠다'
나는 쪽잠을 자기 위해 엎드리려고 했지만, 그러면 팔 때문에 키보드가 눌리게 된다. 그렇다고 의자를 뒤로 빼서 공간을 확보하려고 하면, 뒤쪽의 책상이 가로막는다. 마치 이곳에서 잠드는 것을 방해하기 위해 설계된 듯한 간격이다.
'내가 키보드를 옮기면 어쩔 건데?'
귀중한 수면시간을 확보하기 위해 키보드를 들어올리는 순간, 수업의 끝을 알리는 종소리가 울렸다. 드디어 하교 시간이다.
가방을 챙겨 교문 밖으로 걸어나오니, 뜨거운 열기가 나를 반겨준다. 아직 6월 초인데 날씨는 한여름처럼 더웠다.
'난 하루 종일 집에만 있으니까 자외선 좀 쬐도 문제없겠지'
이런 실없는 생각이나 하면서 버스 정류장으로 걸어갔다.
버스 창문에 기대어 눈을 감았다. 창을 뚫고 얼굴을 비추는 햇빛과, 머리 위에서 내려오는 에어컨 바람의 조합이 나쁘지 않았다. 유리창의 진동은 애써 무시한 채 새벽까지 풀던 문제에 대해 생각했다.
처음에는 단순한 SQL Injection 문제인 줄 알았다. 드림핵 웹해킹 강의에서 배운 적이 있는 유형이었던 만큼, 나는 자신만만했다. 페이로드가 막히기 전까지는 말이다. 뒤늦게 docker-compose.yml을 확인해본 후에야 WAF 서비스가 앞쪽에 있다는 것을 눈치챌 수 있었다. 사실 docker-compose나 WAF가 무엇인지는 문제가 막힌 직후에야 찾아봤지만 말이다.
'하.. 배움에는 끝이 없구만'
그럴만도 했다. 내가 정보보안에 입문한 것 자체가 이제 겨우 1년 남짓이니까. 아니, 1년이면 꽤 오래된거 아닌가?
물론 1년 동안 내가 한 짓이라고 해봤자 무턱대고 포너블에 도전하면서 Segmentation fault를 볼 때마다 컴퓨터 탓을 하며 시간을 낭비하다가, 웹해킹으로 길을 틀어버린 것 뿐이다.
난 분명 처음에는 개발자를 지망하던 학생이었지만, 무엇을 계기로 보안으로 진로를 바꾸게 되었는지는 기억이 희미했다. 보나마나 분명 시스템을 뚫고 다니는게 멋있다고 생각했기 때문이겠지.
버스가 크게 덜컹거렸다. 미세 뇌진탕이라도 걸릴 것 같아서 창문에서 머리를 땠다. 휴대폰을 들고 습관적으로 디수코드 앱을 눌렀다. 드림핵 디수코드 서버가 나타났다.
🐱 집배원 아모 [APP] 6/3/26, 15:34 PM
User solved Memo Behind The Wall.
User
kwh0904
6/3/26, 15:34 PM
공교롭게도 내가 풀고 있던 문제를 누군가 풀었다는 알림이다. 이미 풀이 횟수가 수십회는 되는 문제였지만, 알림을 보고 나니 괜히 초조해지기 시작했다.
'난 이 문제를 영원히 못 풀 운명은 아니겠지...'
버스에서 내리자마자, 아파트로 발걸음을 재촉했다. 이미 나에게는 컴퓨터 모니터에 VSCode창이 뜬 모습이 눈에 선했다.
도착하자마자 가방과 겉옷을 침대에 집어던지고, 컴퓨터 비밀번호를 두드렸다. 오늘이야말로, 이 문제의 끝을 보고 말 것이다.
'그 전에 물만 마시고..'
'화장실도 다녀오고...'
'책상 정리도 좀 하고...'
좋다. 이제 진짜 문제를 해결할 시간이다.
docker compose up
문제 구조는 단순하다. 단순한 온라인 메모 서비스를 구현한 것이다. 메모 내용 검색이나 로그인/로그아웃 부분을 살펴보느라 시간을 한참 낭비했지만, 결국 태그 필터 기능에 SQL Injection 취약점이 존재한다는 것을 알아냈다. 그 뒤로는 WAF가 있는지도 모르고 몇 시간 동안 삽질만 했었지만...
나는 어젯밤의 삽질을 되짚어보았다.
' or '1'='1
차단.
union select
차단.
/**/
차단.
대충 SQL Injection에서 봤다 싶은 건 전부 막혔다. 심지어 대소문자를 섞어도 막혔다. 필터링 목록은 허접하게 생긴 것 같으면서도, 내가 어설프게 아는 지식 정도는 모조리 짓밟을 만큼 견고했다. 이 문제를 푼 사람들이 멀게 느껴졌다.
'...푼 사람에게 DM으로 슬쩍 물어볼까?'
아니, 그건 내 자존심이 허락하지 않았다. 하지만 내 명석한 좌뇌는 계속 돌아가며 온갖 합리화를 시도했다.
'물어보는 편이 더 효율적 아닌가? 다른 사람도 그렇게 풀지 않았을까? 충분히 풀려고 노력했잖아.'
결국 결론은 잠시 미뤄두고 모니터에 다시 집중하기 시작했다.
'...조금만 더 보자'
...지쳤다. 이제 한계다. 수면 부족으로 피로한 두뇌에 인지 부하까지 겹쳐져서 쓰러지기 일보 직전이었다. 나는 침대 위의 가방을 아래로 내린 다음, 겉옷은 그대로 두고 침대에 푹 쓰러졌다.
그러나 극심한 피로에도 불구하고 가슴이 뛰면서 잠이 오지 않았다.
결국 난 휴대폰을 꺼내들고 습관적으로 뉴튜브 앱을 눌렀다. 내 관심사에 최적화된 영상들이 홈에 나열됐다.
[지금부터 패스를 해킹합니다]
[유명 암호화폐 거래소가 코드 한 줄 때문에 털린 과정]
[12시간 동안 모든 해킹 당하기]
[역사에 남은 레전드 보안 취약점들]
[세계해킹방어대회 우승한 '예비 고등학생' 해커]
이미 보긴 했지만, 마지막 영상에서 스크롤이 멈췄다. 조회수가 무려 100만회에 달하는 이 영상의 주인공은 내가 아는 사람이다. 나와 동갑이면서 비슷한 시기에 해킹에 입문했고, 온라인으로 만나서 CTF도 같은 팀으로 몇 번 나간 경험이 있다.
이름은 정민준. 닉네임은 H1NST4NCE. 무슨 의미인지는 모른다.
그와 연락을 하지 않은지도 한참이 흘렀다. 그는 무서울 정도로 빠르게 성장해서, 이제는 닿을 수 없는 곳으로 가버린 것 같았다. 건너건너 나와 같은 학교에 입학했다는 소식은 들었지만, 아직 마주친 적은 없다.
직접 학교를 물어보면 되지 않냐고 할 수 있지만, 다른 팀으로 훌쩍 떠나버린 그에게 갑자기 DM을 보내는 것은 왠지 내키지 않았다.
영상 댓글창의 정민준을 향한 온갖 칭찬들을 보고 있자니, 마음이 무거워졌다. 내가 왜 이런 감정을 느껴야 하는 걸까.
'내가 천재가 아니라서?'
쓸데없는 생각은 그만두고 잠들기로 했다. 눈을 감으니, 방금 풀던 문제의 코드가 아른거리면서 의식이 서서히 흐려졌다.
의식이 깊은 늪 속으로 가라앉던 그때였다. 귓가를 때리는 날카로운 기계음과 함께, 망막 위로 푸르스름한 빛의 창이 강제로 떠올랐다.