Webhacking.kr 50번 문제
50번 문제는 이전 문제보다 150스코어 높은 450스코어의 해당하는 문제이다. 문제를 보면 폼이 하나 보이고, 그 위에 큰 글자로 “SQL INJECTION” 이라 적혀 있다. 그렇다. 이 문제 또한 “SQL INJECTION” 문제인 것 이다. 폼은 “id”, “password” 란이 보이고 기본 값으로는 “guest” 로 기재되어있다. Get parameter 의 id 키 값을 mb_convert_encoding 함수를 통해 재 대입하는데, 이 때 euc-kr 인코딩에서 utf-8인코딩으로 변환하는 과정에서의 취약점이 존재합니다. ",$ck)) exit();if(eregi("");if($data[0]=="2") echo("level : 2");} if($data[0]=="3"){@solve();}  if(!$data){echo("Wrong");} } ?> php 에서 magic_quotes_gpc 설정하여 ‘, “, /, %00등의 값이 들어가게 되면 /와 함께 붙게 되어 injection을 방어합니다. 멀티바이트를 사용하는 언어셋 환경에서는 함수가 \ 앞에 %a1~%fe의 값이 들어오게 되면 %a1\이 한 개의 문자로 취급하여 인코딩해서 \를 치환해버린다. pw 를 md5로 인코딩 하는 부분을 주석 처리하여 id와 pw가 이어지게하여 인젝션을 시도한다. select lv from members where id='%a1'/*' and pw=md5('*/union select 3 #') 
Google cloud connecting to Linux Instances
Google cloud connecting to Linux Instances 본 문서에서는 SSH 를 통해 구글 클라우드 VM 인스턴스에 접속하는 방법을 서술하고있습니다. 구글 클라우드 공식 문서를 참고한 이후, 개인적으로 정리하고 작성한 문서입니다. SSH Key 등록 SSH 키가 존재하지 않는 경우, 먼저 SSH Key 를 생성해주세요. 명령어 옵션에 대한 설명은 아래와 같습니다. ssh-keygen -t rsa -C "your-id@{your-email}" Key 가 이미 존재하는 경우, 위 명령어 질의는 건너뛰고, Public key 내용을 cat 명령어를 통해 출력 후 구글 클라우드 Metadata 탭으로 이동합니다. 탭 내 항목이 두개가 존재하는데, 여기서 Add ssh key 를 선택 후, 출력된 Public key 내용을 추가합니다. SSH 접속 아래 명령어를 통해서 접속합니다. ”[]” 안에 담긴 항목들의 설명은 아래와 같습니다. PATH_TO_PRIVATE_KEY SSH KEY 비공개키 주소를 기입합니다. (e.g. ~/.ssh/id_rsa) USERNAME 키 생성시 등록한 아이디 EXTERNAL_IP_ADDRESS 접속을 희망하는 인스턴스 외부 아이피 주소 ssh -i [PATH_TO_PRIVATE_KEY] [USERNAME]@[EXTERNAL_IP_ADDRESS]
Webhacking.kr 49번 문제
49번 문제는 300스코어의 문제이며, 이전의 문제 풀이 했을때 같은 쉬운 편에 속하는 문제와 비슷한 유형이다. 거의 데자뷰급.. 페이지를 보면, 머리말에 SQL INJECTION 이라 기재되어있다. 그렇다. 본 문제는 SQL Injection 문제이다. 페이지내 작은 입력 폼이 보이고, “level” 이라는 라벨 옆 한개의 인풋 필드가 존재하는데, 이 필드의 기본 값은 “1” 이다. 기본값으로 요청을 해보니, 입력 폼 하단에 “zzibong” 이라는 값이 추가되어 응답한다. 이 후, 다른 값으로 요청해 보았을 때 위의 문자열을 더 이상 응답해주지않고있다. ”   ”, “&&” 등의 연산자를 테스트겸 추가하여 요청해보니 추가된 연산자에 따라서 “zzibong”값이 응답되었다. 문제 내 소스를 보니, 힌트 페이지가 숨겨져있었고, 숨겨진 힌트 내용은 아래와 같다. if(time()<1258110000) exit();if($_GET[lv]){if(eregi("union",$_GET[lv])) exit();if(eregi("from",$_GET[lv])) exit();if(eregi("select",$_GET[lv])) exit();if(eregi("or",$_GET[lv])) exit();if(eregi("and",$_GET[lv])) exit();if(eregi("\(",$_GET[lv])) exit();if(eregi("\)",$_GET[lv])) exit();if(eregi("limit",$_GET[lv])) exit();if(eregi(",",$_GET[lv])) exit();if(eregi("/",$_GET[lv])) exit();if(eregi("by",$_GET[lv])) exit();if(eregi("desc",$_GET[lv])) exit();if(eregi("asc",$_GET[lv])) exit();if(eregi("cash",$_GET[lv])) exit();if(eregi(" ",$_GET[lv])) exit();if(eregi("%09",$_GET[lv])) exit();$q=@mysql_fetch_array(mysql_query("select id from members where lv=$_GET[lv]"));echo($q[0]);if($q[0]=="admin") @solve();} eregi 라는 method의 설명은 아래와 같다. Case insensitive regular expression match 대소문자 구별 없이, 첫 번째 인자 값에 해당하는 문자열을 두번째 인자값에 찾는다. 이 후 참이라면 exit method keyword 를 통해 프로세스를 종료한다. 따라서 아래 목록에 있는 문자열은 사용할 수 없다는 것 이다. union from select or and \( \) limit...
Introduction to Promises in Javascript
Introduction to Promises in Javascript 이 문서는 Promise 구문에 대한 지식이 없는 분들께 도움을 드리고자 제가 이해한 내용을 공유합니다. 현재의 자바스크립트 시장은 격동의 시기라고 할 수 있습니다. ECMAScript6 등 여러 새로운 표준 기술이 잇달아 나오고있습니다. 여기서 소개하고자하는 Promise 또한 이 표준 기술 중 하나입니다. 아래 참고 그림은 Promise 가 어떤 동작 방식을 취하고 있는지 잘 알려주고 있습니다. 자세한 내용은 목차에 기재된 “Promise 는 어떻게 사용해요?” 에서 다루겠습니다. 본 문서의 목차는 아래와 같이 구성 되어있습니다. Promise 란 무엇인가 Promise 를 사용하면 장점이 뭔가요? Promise 는 어떻게 사용해요? Promise의 상태(State)에 대해서 Promise의 API 알아봐요 ! Promise 란 무엇인가 자바스크립트는 모든 작업이 Async(비동기)로 이루어집니다. “Promise” 객체에 대하여, 모질라 개발 문서에는 아래와 같이 기재되어있습니다. Promise 객체는 비동기 계산을 위해 사용됩니다. Promise는 아직은 아니지만 나중에 완료될 것으로 기대되는 연산을 표현합니다. Promise는 비동기 처리 로직을 추상화 한 객체와 그것을 조작하는 방식을 말합니다. 개념은_ E 언어에서 처음 고안_됐으며 병렬 및 병행 프로그래밍을 위한 일종의 디자인입니다. 이 디자인을...
동물원 from BOJ
문제 어떤 동물원에 가로로 두칸 세로로 N칸인 아래와 같은 우리가 있다. 이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다. 동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다. 입력 첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다. 출력 첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라. _ _ 풀이 d1[i] = 2*i인 우리에서 i 번째 칸에 사자를 0마리 놓는 경우의 수 d2[i] = 2*i인 우리에서 i 번째 칸의 한 쪽에만 사자를 1마리 놓는 경우의 수 d1[i] = d1[i-1] + d2[i-1] * 2 d2[i] = d1[i-1] + d2[i-1] 1차원으로 더 압축 했을 시 d1[i] = d1[i-1] + d2[i-1] * 2 d1[i] = (d1[i-2] + d2[i-2] * 2) + (d1[i-2] + d2[i-2]) *...
Webhacking.kr 40번 문제
Challenge 40 500 스코어 문제이며, 다른 문제에 비하여 상대적으로 높은 점수의 속한다. “no”,”id”,”pw” 세개의 필드가 있고, 하단에는 로그인 버튼이 있는 폼이 존재한다. 기본적으로 필드에는 값들이 대입되어있다. 대입되어있는 값의 정보는 아래와 같다. no : 1 id : guest pw : guest 테스트를 위해 no 파라미터에 인젝션 쿼리를 대입하여 질의해 보았다. 응답 값은 “access dinied” 이다. 이번엔 조건을 거짓으로 만들어보니 “Failure” 를 응답한다. 응답 이후에, meta 태크를 통해서 2초 후 페이지를 이전 페이지로 리다이렉트한다. -1||if(no=2,1,0) if 문을 이용해서 no 파라미터가 2 이면 1을 반환하도록 해보았다. 이후 페이지가 리다이렉트 되는데, 리다이렉트 된 페이지에는 admin password 라는 입력 폼이 보인다. 음.. password 를 알아낼 수 있는 힌트를 주지 않는다. 따라서 MySQL LIKE 구문을 사용하여 “pw like %” 와 같은 쿼리를 질의하여 패스워드를 알아낼거다. 우선 블라인드 인젝션을 위해 pw 필드의 길이를 알아야하기 파이썬 스크립트를 작성했다. 덕분에 패스워드 길이가 10이라는 것을 알아낼 수 있었다. 이후에 파이썬 스크립트를 다시 작성해, 패스워드를 알아내서 본 문제를 Solved 했다. 스크립트는...
Webhacking.kr 39번 문제
100 스코어의 문제이다. 문제의 힌트코드는 아래와 같다. $pw="????";if($_POST[id]){$_POST[id]=str_replace("\\","",$_POST[id]);$_POST[id]=str_replace("'","''",$_POST[id]);$_POST[id]=substr($_POST[id],0,15);$q=mysql_fetch_array(mysql_query("select 'good' from zmail_member where id='$_POST[id]"));if($q[0]=="good") @solve();} post 메소드의 id 파라미터를 두번 치환한다. 치환하는 항목은 아래와 같다. \\을 공백으로 치환 ‘를 “로 치환 $_post[id] = substr($post[id],0,15); 는 0 ~ 15에 열까지를 출력한다는 것 이다. 이 후 데이터를 가져온다. 가져온 데이터가 good 이라면 Solve 된다. select 문을 보면 “'”가 안닫혀 있는 것을 확인할 수 있다. 즉, 입력할 때 ‘를 반드시 입력해야 한다는 것 이다. substr 함수를 통해 15글자를 잘라낸다. 이 말은 즉 15번째 글짜가 “’” 이면 총 16글자가 되므로 마지막 두글자는 “ “ “ 이다. 따라서 입력 값은 admin ' 이 된다.
일기
일기를 꾸준히 작성하는 편이다. 20살때부터 시작된 이 습관은 지금까지 유지되고있다. 아마, 나의 습관 중 가장 좋은 습관이 아닌가 자부한다. 아래는 내가 일기를 저장하는 방법이다. 나는 별도의 클라우드에 저장하는 편 이다. 이유는 키보드 입력을 통해서 글을 적는 것이 편한 것 도 있지만, 제일 큰 것은 일기장을 관리할 자신이 없었다. 본 글은 “나 일기쓰는 착한 아이에요.” 를 강조하려는 것은 아니다. Tools of titans 책 한 챕터의 연장선상인 것 같은데, 일기의 중요성에대하여 얘기해보고자한다. 책을 읽기 이전의 나는 하루일과를 마무리하고 침대에 눕기전 시간을 내서 일기를 썻다. 하루를 마무리하며 아쉬웠던 점, 그리고 배운점에대하여 적었다. 아마 이것이 보통의 경우가 아닌가 생각된다. 하지만 타이탄의 도구들에서는 아침에 일기를 작성할 것을 권장한다. 챕터의 제목도 “아침 일기” 이다. 요약하자면, “Positive thinking” 과 “To do” 이다. 일리가 있는 말이다. 긍정적 사고방식으로 하루를 연다면 태도나 성과 또한 기존 사고방식과는 다를거다. 목표를 재 정비 하는 것 또한 아주 좋은 방법이라 생각된다. 아래 항목은 본인 일기에 들어가는 항목들이다. “타이탄의 도구들” 에 나온 항목에서 별도의...
Webhacking.kr 38번 문제
About 38 challenge 38번 문제는 100스코어의 비교적 낮은 스코어의 문제이다. 문제를 보면 “LOG INJECTION” 크게 적혀있고, 아래 간단한 입력 폼이 있다. login 과 admin 두개의 버튼이 존재하는데, login 은 폼의 submit 을 요청하고, admin은 페이지를 admin.php 로 리다이렉트 한다. 리다이렉트 된 페이지에서는 “log” 라는 짧은 메세지가 페이지에 출력되어있다. 이 후, 다시 이전 폼으로 돌아와서, 테스트 용도로 hax0r 이라 입력을 해보았다. 이 후, 다시 log 가 존재하는 페이지로 이동하니, 아래와 같은 로그가 생성되었다. log 생성 기준은 입력 시 아래와 같은 포맷으로 저장되는 것으로 유추된다. {요청 아이피}:{요청 값 = id} log1.{보안이슈로 가림}.24.49:hax0r  hax0r 이 아닌 admin 으로 요청하니 이번의 새로운 output 이 나왔다. you are not admin 궁극적으로 비 정상적 로그를 생성하여 본 문제를 Solve 해야 한다. 개행 문자를 사용해서 본 문제를 해결할거다. 아래와 같은 값을 생성하여 재 요청한다. hax0r\{본인 아이피}:admin Glossary 개행 문자 컴퓨터에서 줄바꿈을 나타내는 제어문자
내가 공부하는 이유
About 괴짜 교수 사이토 다카시가 지필한 책 이다. 프롤로그에서 말 하 듯 세상에 쓸모없는 공부란 없다. 배움은 뭐든지 옳다. 그 것이 비단 겉무늬가 멋진 것이 아닌 사회에서 하찮다고 여겨지는 것 또한 옳음에 속한다고 생각한다. 아래는 문장은 책의 나오는 내가 가장 좋아하는 대목이다. 어떤 상황에서든 배울 것은 반드시 있으며, 그 것을 찾아내는 것은 전적으로 본인에게 달렸다.
Codility - PtrListLen 알고리즘 풀이
PtrListLen 회사에서 면접 진행하기 앞 서, 면접자에게 문제를 주기 전 먼저 Codility 문제를 풀어보고 난이도를 판단해서 문제를 고르기로하여 간단하게 문제를 풀어보았다. A pointer is called a linked list if: it is an empty pointer (it is then called a terminator or an empty list); or it points to a structure (called a node or the head) that contains a value and a linked list (called the tail). The length of a list is defined as the total number of nodes it contains. In particular, an empty list has length 0. For example, consider the following linked list: A -> B -> C -> D -> This list contains four nodes: A, B, C and D. Node D is the last node and its tail is the terminator. The length of this list is 4. Assume that the following declarations are given: class IntList {  var $value = 0;  var $next...
Codility - DeepestPit 알고리즘 풀이
DeepestPit 회사에서 면접 진행하기 앞 서, 면접자에게 문제를 주기 전 먼저 Codility 문제를 풀어보고 난이도를 판단해서 문제를 고르기로하여 간단하게 문제를 풀어보았다. 전달 되는 인자 값은 array 형태이며 n 개의 정수로 구성되어있다. max pit depth 값을 반환하면 된다. 메소드를 총 세개로 구성하였는데.. 퍼포먼스 이슈가 있어 이 부분에서 감점 받았다..힝 Given an array of integers, find a bitonic sequence with maximal difference between the middle term and the first and the last terms. Task description A non-empty zero-indexed array A consisting of N integers is given. A pit in this array is any triplet of integers (P, Q, R) such that: 0 ≤ P < Q < R < N; sequence [A[P], A[P+1], …, A[Q]] is strictly decreasing, i.e. A[P] > A[P+1] > … > A[Q]; sequence A[Q], A[Q+1], …, A[R] is strictly increasing, i.e. A[Q] < A[Q+1] < … < A[R]. The depth of a pit (P, Q, R) is the...
Becoming a Better Programmer
좋은 프로그래머가 되고싶다. 이 분야에서 최고가 되고싶다. 내가 작성한 코드들이 더 많은 세상에서 더 많이 공유되었으면 좋겠다. 어떤 코드든 만지기 전 보다 더 나은 구조, 더 나은 테스트, 더 나은 이해를 포함해 좋게 만들어야한다.
Webhacking.kr 37번 문제
37번은 250 스코어의 문제입니다. 문제를 보면, 알수 없는 파일 리스트와 7777 포트가 열려있는데 루프백 아이피 그리고 폼 버튼이 보입니다. 하단에 위치한 폼 버튼의 임의로 이미지 사진(20170213_230929.png)을 업로드 했습니다. 업로드 이 후, 이미지가 정상적으로 리스트에 나오는 것을 확인했습니다. ....numbertmp-1499973060tmp-1499996289tmp-1499996421tmp-1499996897tmp-1499996923127.0.0.1:7777 현재까지의 시점을 보았을 때, 이로는 정답의 실마리를 찾지 못하여 소스코드를 열어보니 index.phps 가 숨어있었습니다. 문제의 힌트를 위해 해당 파일의 경로로 이동합니다. 이동했다면 아래와 같이 문제를 구성하는 코드가 보일 것 입니다. 코드의 대해서 잠깐 얘기해보겠습니다. 로컬 시간을 time 변수에 대입하고 “tmp” 디렉토리에 “tmp-“.$time 이라는 파일의 루프백 아이피를 넣어 생성합니다. “tmp/.number” 파일은 파일의 갯수를 측정하는 파일로써 find 함수로 한줄 씩 읽으며 배열로 반환하고 그 수를 증가시킨 값을 다시 본 파일의 적습니다. tmp 파일이 30개를 이상이면 unlink 하는 부분 또한 있는데 별로 중요한 내용은 아니니 설명하지 않겠습니다. 중요한 부분은 다음에 나오는 파일명 중 특정 문자열을 공백으로 치환하는 부분입니다. 치환의 대상자는 아래와 같다. < , . space tmp 디렉토리 이하에서 업로드 된 파일명을 쓰기 모드로 열고...
Webhacking.kr 36번 문제
36 번 문제는 200스코어의 문제입니다. 페이지 로드 시 아래의 내용들이 보입니다. 힌트로 “vi”, “blackout” 을 알려주고있네요. vi + blackout vi 를 자주 사용하는 사람은 알겠지만, 파일을 편집할 때 backup 파일로 “swp” 확장자의 복제본이 생성됩니다. 해당 백업본의 파일명으로 요청을 하니 패스워드를 알려줍니다. 본 패스워드를 auth 항목에서 submit 하면 클리어 입니다. hintviblackout