제 1 회청소년화이트해커경진대회 Kwon Hyuk (pwn3r)
Level1 1. 20A9(16 진수 ) 와 1100111111(2 진수 ) 의합을 10 진수로나타내시오 2. 10011000 과 00110101 의 xor 연산을하고 10 진수로나타내시오 3. N e w H e a r t 각각의문자하나를 ascii 코드값의 10 진수합으로나타내면? 1, 2, 3 번키를붙여서인증 간단한연산문제들이다. python 을이용해쉽게계산할수있다. (1) >>> 0x20A9 + 0b1100111111 9192 (2) >>> 0b10011000 ^ 0b00110101 173 (3) >>> str = "NewHeart" >>> sum = 0 >>> for i in str:... sum += ord(i)... >>> sum 798 세값을이어붙인값이인증키이다. Flag : 9192173798
Level2 http://1.221.63.146:10007/lv2/ 주어진 URL 에접속해보면핸드폰으로접속하라는문구만이나온다. pwn3r@localhost:~/ctf/newheart/level11$ curl http://1.221.63.146:10007/lv2/ 핸드폰으로접속하세요 User-Agent 를검사하여핸드폰인지 PC 인지구별한다고생각할수있다. 아이폰의기본 User-Agent 로바꾸어접속시켜본다. pwn3r@localhost:~/ctf/newheart/level11$ curl --user-agent "Mozilla/5.0 (iphone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3" http://1.221.63.146:10007/lv2/ <h6>admin Page</h6><!--password is Well begun is half done.--> Admin Page 라는문구와함께주석으로인증키가나왔다. Flag : Well begun is half done
Level3 http://1.221.63.146:10007/lv3/nh_header.bmp 누군가뉴하트홈페이지에있는로고에비밀번호를숨겨놓았다. < 주어진그림파일 > 주어진그림파일을확대해보면배경과색깔이전혀다른빨강, 초록, 파란색점이군데군데찍 혀있는것을볼수있다. ( 동그라미친부분 ) 이미지뷰어프로그램 Alsee 의픽셀정보보기기능을이용해중간중간에찍힌점들의 RGB 정보를 확인해보니한가지색깔의수가높고나머지두수는같았다. 똑같이눈에띄는점들의위부터순서대로 RGB 정보를수작업으로확인해제일높은각픽셀에서 가장높은값을모아아스키문자로변환해이어붙여보니인증키가나타났다. Flag : newhe@rt!
Level4 http://1.221.63.146:10007/lv4/problem.zip 주어진 zip 파일의압축들풀어보면 7 개의 png 파일과 thisiskey.txt 라는텍스트파일이있다. 그림파일과텍스트파일에서두가지특이한점을찾을수있다. 1) 7 개의그림, 각그림은 7x7 의네모로이루어짐. 2) 7 개의문장, 각문장은 49 글자 한 png 파일에있는작은네모의수와한문장에있는글자의수가동일하므로, 문장마다각 png 에서색칠된부분만모아, 이어붙이면 base85 암호문이나올거라고추측해보았다. ( 제일앞에 decodebase85 라고되있으므로 ) <~E+*g/ GAhM4?Y ORgBOu! rddr0d@ r#drb4#
7^F*),> @;I)1~> 이를이어붙이면정상적인 base85 암호문이만들어진다. <~E+*g/GAhM4?YORgBOu!rDdR0d@r#drB4#7^F*),>@;I)1~> Base85 decode 해보니인증키가나왔다. password_is_hello_hacking_festival!! Flag : hello_hacking_festival!!
Level5 http://1.221.63.146:10007/lv5/h4ck.apk Apk 파일하나가주어졌다. Zip 압축파일과포맷이동일하므로 zip 으로열어압축을풀고, classes.dex 를.jar 로변환후 GUI 자바디컴파일러인 jad-gui 로열어본다. 수상한문자열을 decript 라는함수에인자로넘겨주고, 결과값을화면에보여주는함수가있다. 인증키를보여주는과정이라고의심해볼수있다. decript 함수를 C 프로그램으로작성해실행해보았다. pwn3r@localhost:~/ctf/newheart/level5$ cat gen.c #include <stdio.h> int main(int argc,char **argv) int a; char table[] = "abcdefghijklmnopqrstuvwxyz/.1234567890~_:%+=?"; int arrayofint[45]; arrayofint[0] = 1; arrayofint[1] = 0; arrayofint[2] = 34; arrayofint[3] = 24; arrayofint[4] = 17; arrayofint[5] = 11; arrayofint[6] = 18; arrayofint[7] = 21; arrayofint[8] = 6; arrayofint[9] = 26; arrayofint[10] = 16; arrayofint[11] = 7; arrayofint[12] = 43; arrayofint[13] = 2; arrayofint[14] = 8; arrayofint[15] = 3; arrayofint[16] = 36; arrayofint[17] = 22; arrayofint[18] = 10; arrayofint[19] = 28; arrayofint[20] = 9; arrayofint[21] = 13; arrayofint[22] = 14; arrayofint[23] = 20;
arrayofint[24] = 5; arrayofint[25] = 41; arrayofint[26] = 25; arrayofint[27] = 37; arrayofint[28] = 29; arrayofint[29] = 31; arrayofint[30] = 44; arrayofint[31] = 30; arrayofint[32] = 35; arrayofint[33] = 23; arrayofint[34] = 38; arrayofint[35] = 40; arrayofint[36] = 33; arrayofint[37] = 4; arrayofint[38] = 27; arrayofint[39] = 19; arrayofint[40] = 15; arrayofint[41] = 12; arrayofint[42] = 42; arrayofint[43] = 32; arrayofint[44] = 39; int i, j, k ; j = strlen(argv[1]); for(i=0; i<j; i++) for(k=0;k<45;k++) if(argv[1][i] == table[k]) for(a=0;a<45;a++) if(arrayofint[a] == k) printf("%c", table[a]); printf("\n"); pwn3r@localhost:~/ctf/newheart/level5$./gen ygbahi?+hih5vrhhsb1r diablo3+lol=hellgate 결과로겁나키값같이생긴문자열이나타났다. 인증을했더니성공했다. Flag : diablo3+lol=hellgate
Level6 http://1.221.63.146:10007/lv6/nhf3.xap 주어진파일은윈도우폰어플리케이션이다. 윈도우폰에뮬레이터를설치해어플리케이션을실행시켜보니 9 개의숫자버튼과 Submit 버튼, Cancel 버튼이나온다. 최대 9 자리까지각숫자를한번씩입력할수있다. < 에뮬레이터실행화면 > 숫자입력후 submit 버튼을누르면위에알수없는문자열이나타난다. zip 파일과포맷이동일하므로 zip 으로압축을풀고, 내장된 nhf.dll 을닷넷디플렉터로열어분석해 본다. 아래는 submit 버튼을누르면실행되는부분이다.,
위함수는 a5b8f53248a781e32e4fac5190dbfabc 를 key 로, 입력한숫자를 iv 와버튼의숫자들을 iv 로하여 "e069836af6c41b560477d80ce8b08a36" 를 AES-128 로암호화한다. submit버튼을누르면에뮬레이터화면에문자열이잘려서나타난다. 그래서정상적으로결과문자열을복사할수있도록위코드와같은동작을하도록 C# 프로그램을만들고, xap파일에포함된 WMAppManifest.xml에있는 9자리의숫자 ( 아래사진에서 134628957) 가어플리케이션에서입력됬을때생성되는암호를구해인증을시도했더니성공했다. ( 위숫자순서로어플리케이션에서입력하면변수엔 284361597 로들어감 ) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO; namespace ConsoleApplication1 class Program static void Main(string[] args) byte[] arr = new byte[10]; byte a = 3;
byte b = 5; byte c = 6; byte d = 4; byte e = 8; byte f = 1; arr[0] = 0; arr[1] = 2; arr[2] = 8; arr[3] = 4; arr[4] = 3; arr[5] = 6; arr[6] = 1; arr[7] = 5; arr[8] = 9; arr[9] = 7; Rfc2898DeriveBytes rfc2898derivebyte = new Rfc2898DeriveBytes("a5b8f53248a781e32e4fac5190dbfabc", arr); Aes aesmanaged = new AesManaged(); aesmanaged.key = rfc2898derivebyte.getbytes(aesmanaged.keysize / 8); aesmanaged.iv = rfc2898derivebyte.getbytes(aesmanaged.blocksize / 8); using (MemoryStream memorystream = new MemoryStream()) ICryptoTransform cryptotransform = aesmanaged.createencryptor(); using (CryptoStream cryptostream = new CryptoStream(memoryStream, cryptotransform, CryptoStreamMode.Write)) byte[] bytes = Encoding.UTF8.GetBytes("e069836af6c41b560477d80ce8b08a36"); cryptostream.write(bytes, 0, (int)bytes.length); cryptostream.flushfinalblock(); Console.WriteLine(Convert.ToBase64String(memoryStream.ToArray())); Console.ReadLine(); Flag : u+vscbgx4hx8onbrk0dh8rxcbdg1fncoh8xn2uy8adkouk4hchvrk/lgpumcqq8n
Level7 http://1.221.63.146:10007/quiz/ 대회중가장많은시간을보내게했던문제이다. 주어진 URL에접속하면자바스크립트로구현된룰렛게임을진행한다. 룰렛게임은 5월1일 ~5월31일중에 100번을할수있으며한번게임을한후엔, 30분이상이지나야또다시게임을할수있다. 각룰렛에서얻는최대포인트는 3포인트이다. 이룰렛게임을통해얻은누적포인트로 HINT1(50 point), HINT2(100 point), ANSWER(1000 point) 등을살수있다. 포인트를관리하는페이지에서타임스탬프를인자로받아관리함을이용해, 타임스탬프를 30분에해당하는수만큼증가시켜가며접속시켜포인트를빠르게늘릴수있었지만 100번까지만가능하기때문에최대 300포인트까지밖에올릴수없다. 그래서힌트를읽어보니두힌트는아래와같다. HINT1: timestamp HINT2 : UPDATE quiz set timestamp=(value), point=(value), counter = (value) WHERE ip_addr = (ip) 두힌트로미루어보아위쿼리의 timestamp value부분에서 sql 인젝션취약점이있다고생각했지만원하는대로되지않고오랜시간이지나그냥자고일어났더니다른참가자의실수로내포인트가 213574357점으로올라가있었다. ㄳ Flag : NewHeartBeat
Level8 http://1.221.63.146:10007/lv8/wavwav.wav 주어진파일은예전에방영됬던드라마 NewHeart 의 OST 가있는 wav 음악파일이다. 음악파일안에 string 이나 lsb 를모아봐도특별한정보를얻을수없어해당음악파일의 스펙트럼을확인해보았다. 위사진과같이스펙트럼에서숫자들이나타나는것을불수있다. 333233423121341231 / 00011100110100000010000101010001100000010101 왼쪽에있는숫자만큼오른쪽에있는숫자를나누고, 나누어진각숫자들을모스부호로서문자로 변환해보았다. 000/111/001/10/100/000/0100/00/101/0/10/0/011/0000/0/01/010/1 3 3 3 2 3 3 4 2 3 1 2 1 3 4 1 2 3 1 000/111/001/10/100/000/0100/00/101/0/10/0/011/0000/0/01/010/1 ( 0->., 1->-) =>... ---..- -. -......-.... -.-. -...--.....-.-. => S O U N D S L I K E N E W H E A R T 0 을. 으로, 1 을 로나타내어모스부호로서알파벳으로변환해보니 SOUNDLIKENEWHEART 라는 문자열이나왔고, 이를소문자로인증했더니인증에성공했다. Flag : soundslikenewheart
Level9 Download Date? (yyyymmddhhmmss) http://1.221.63.146:10007/lv9/prob.zip 주어진파일은 Internet Explorer History File 이다. pwn3r@localhost:~/ctf/newheart/level9$ file Prob Prob: Internet Explorer cache file version Ver 5.2 Internet Explore History File 은접속한 URL 과마지막수정시간, 마지막접속시간, 캐시폴더 이름, 파일명, HTTP Header 등을저장해둔다. Index.dat analyzer 라는프로그램을이용해저장된정보를간단하게정리해서볼수있다. download 라는서브도메인이붙어있는것으로보아 http://download.cnet.com 에서파일을다운로드것으로추측할수있다. 파일을다운로드한날짜는 download.cnet.com 에접속한 10/19/2012 10:55:14 이므로문제에서요구한형식 (yyyymmddhhmmss) 대로맞추면인증키는 20120119105514 이다. * 관련문서 : http://forensicinsight.org/wp-content/uploads/2012/03/insight_web-browser- Forensics_Part1.pdf Flag : 20120119105514
Level10 http://1.221.63.146:10007/lv10/android.zip NewHeart 수사대는어떤사건을수사하던중마약사건에관련된범인을체포하였다. 범인은마약을밀거래하는사람으로특정일특정장소에서밀거래상과접선할예정이었다는점을자백하였으나수사대는더이상의자세한내용은밝혀내지못했다. 유일한단서는범인이가지고있던스마트폰으로, 암거래상과정보를주고받았을가능성이높다. 암거래상과의접선장소및시간을찾아라. 주어진파일은안드로이드폰의전체데이터를백업한것이다. 암거래상과정보를주고받았다면제일먼저문자메시지를의심해볼수있다. 안드로이드에서문자메시지는 /data/data/com.android.providers.telephony/databases/mmssms.db 에저장되며, SMS 일때, 첨부파일등은 /data/data/com.android.providers.telephony/app_parts 에저장된다. 우선첨부파일을확인해보니 PART_13372276170 라는파일명의 jpg 파일이하나있었다. < PART_13372276170 > 이를열어보니인증키가적혀있어인증에성공했다.. Flag : IU_CONCERT_1800_PM_JUNE_02_2012