제 1 회청소년화이트해커경진대회 1 위 persona( 이정훈 ) lokihardt@gmail.com
Level 1. 1 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 번키를붙여서인증 개인적으로이번대회에서가장어려웠던문제입니다. 공학용계산기의힘을빌려가까스로풀어내는데성공했습니다. Key : 9192173798
Level 2. 스마트폰의 User-Agent 로변경핚뒤접속했습니다. Key : Well begun is half done.
Level 3. 누군가뉴하트홈페이지의로고에비밀키를숨겨놓았다.. 비밀키를찾아라. ( 원본로고 : http://1.221.63.146:10007/lv3/nh_header.bmp) ( 변조된파일 : http://1.221.63.146:10007/lv3/nh_header_prob.bmp) 처음에는원본로고, 변조된로고가나눠져있지않아뉴하트의홈페이지에 접속하여로고이미지를받은뒤문제의파일과 RGB 비교를했습니다.!!tr@ewhnesiyke Key : newhe@rt!!
Level 4. <decodebase85~aa$detfs+x&&hj+df#kgl*sfgmldvbzn@d/ ~GiagsAQT#hhsso@tr;TwM$Y(le^ojs^4dawh?&ftzlwrgplY )hoes!d*jgttmr^^zgngfdlxbdb~!!op@cxuat}svf)vmst!z 1ropdtr&*Dity3c)3duaev*cvRtsb&4zt0dnads8hd@lk^jad 1879rwe#d$#ytr./dsudr>m^&ifg?bnBoahcv&(p4jxz#*lkt d@#sda7zxcvb^^8o$af1%7hg*23elj)hjklk,dfbfp>mnb,mo @aytkotz;r((udx&i*dtkqae)0tl%^xr18;wvcvd~jbnzdfg> 단순하게문자열을매트릭스이미지에순서대로넣은뒤색이칠해진 부분만출력했습니다. <~E+*g/GAhM4?YORgBOu!rDdR0d@r#drB4#7^F*),>@;I)1~> Key : hello_hacking_festival!!
Level 5. 리버싱을통해왠지키값처럼보이는것을출력하는부분을발견하여 인젝션으로해당함수의결과값을출력했습니다. Key : diablo3+lol=hellgate
Level 6. Windows Phone 리버싱문제였습니다. 디컴파일러를통해분석을해보니 9개의버튺을누르면 salt 라는배열에차례대로값을넣은뒤 submit을통해해당배열을참조하는복호화루틴을실행하고있었습니다. 버튺을누르는순서는 Description에적혀있었으며디자인파일의추출을통하여버튺의값들을알수있었습니다. 해당정보들을연계하여 c# 프로그래밍을통해키를얻을수있었습니다. Key : u+vscbgx4hx8onbrk0dh8rxcbdg1fncoh8xn2uy8adkouk4hchvrk/lgpumcqq8n
Level 7. 대회종료후해당문제서버접속이안되는관계로구술로대체합니다. 웹해킹문제였으며 30분마다핚번씩룰렛을돌릴수있으며핚번돌릴때마다 0~3점의포인트를획득핛수있습니다. 해당포인트들을모아 1000점을만들면 Key값을획득핛수있었습니다. point 값을서버로보낼때 timestamp 의값도함께보내는데 timestamp 변수의값을조작하여 SQL Injection에성공하여키를획득하였습니다.
Level 8. http://1.221.63.146:10007/lv8/wavwav.wav 해당 wav 파일의스펙트럼을살펴보았습니다. 표시되는값들이모스코드와그의띄어쓰기로판단했습니다. Key : SOUNDSLIKENEWHEART
Level 9. Download Date? (YYYYMMddHHmmss) http://1.221.63.146:10007/lv9/prob.zip 압축을풀면 URLCache 파일이나오는데 IEHist 를사용하여키를획득 하였습니다. Key : 20120119105514
Level 10. http://1.221.63.146:10007/lv10/android.zip NewHeart 수사대는어떤사건을수사하던중마약사건에관렦된범인을체포하였다. 범인은마약을밀거래하는사람으로특정일특정장소에서밀거래상과접선핛예정이었다는점을자백하였으나수사대는더이상의자세핚내용은밝혀내지못했다. 유일핚단서는범인이가지고있던스마트폰으로, 암거래상과정보를주고받았을가능성이높다. 암거래상과의접선장소및시갂을찾아라. 압축을풀어모듞파일을합친뒤카빙을통하여답이담긴 jpg 파일을 획득했습니다. Key : IU_CONCERT_1800_PM_JUNE_02_2012
Level 11. http://1.221.63.146:10007/lv11/newheart.sys VM 상에서실행하셔야합니다! 해당 sys 파일을 IDA 로분석하여키값을출력하는부분을 c 로 작성하였습니다.
Key : Pocari_SWEAT Level 12. http://1.221.63.146:10007/lv12/prob.mov
해당동영상중갂중갂에텍스트가깜빡하며지나갑니다. 텍스트들을모두모아합쳐보면 base64( TWVzc2FnZSA9IHYwbl9tc2cucGhw ) Message = v0n_msg.php 위와같은문자열이나옵니다. This is a hint message for this step. You will get the answer from the following formula. The 'f' is a function to help you find the key message. And the 'input' is an argument of the function. Finally output is a result of 'f(input)'. When 'f'. 'f' == 'v0n_f.html' and 'output' == 'v0n_output', FIND THE KEY FROM INPUT! 해당페이지를들어가보면다음과같은설명이적혀있습니다. v0n_f.html을들어가보면난독화된암호화자바스크립트함수가있습니다. 해당함수를분석하여복호화함수를만들어 v0n_output 파일을복호화하였습니다. public static void decrypt( byte[] arg ) { for( int i = 0; i < arg.length / 11; i++ ) {
} } if( (char)( arg[ i * 11 + 3 ] ) < 0xf0 ) System.out.print( (char)arg[ i * 11 + 3 ] ); else System.out.print( String.format( "%d", arg[ i * 11 + 3 ] + 16 ) ); public static void main( String[] argv ) throws Exception { byte[] cs = { (byte)0x4d, (byte)0x5a, (byte)0xae, (byte)0x74, (byte)0x50, (byte)0xa8, (byte)0x2d,... }; //v0n_output decrypt( cs ); } Key : th1s1sthech4ll3ng3f0ry0urfutur3 Level 13. Title: Restore PNG
TrueCrypt 를사용하여 WTF 파일을마운트핚뒤 ADS 영역을분석하여 나눠져있는 PNG 파일들을모두합쳤습니다. Key : SY573M_ADS_1S_AMAZ1NG Level 14. http://1.221.63.146:10007/lv14/ppppp.pcap
어느해커의컴퓨터에서발견핚파일이다 해당 pcap 을분석하다보면 attack.newheart.kr 로들어가는 URL 들이있는데 그중로그인을시도하는 URL 을타고들어가면 Key 가출력됩니다. Level 15. http://1.221.63.146:10007/lv15/findm2.7z
인증키형식 : id_pw VMWare 이미지가주어집니다. 해당 VMWare 이미지를분석하여 웹페이지의방문기록을분석해보면 위와같은사이트로접속합니다. SQL Injection 을통해 ID 와 Password 를추출하였습니다.
Key : gpcadmin_gpc123!@# Level 16.
http://1.221.63.146:10007/lv16/login.7z Themida로패킹된 exe를발견핛수있으며해당 exe는특정서버와 ssl 통싞을하며키를받아옵니다. 키를받아오기전의메모리안의문자열들과받아온후의메모리안의문자열들을비교하여키값을얻을수있었습니다. Level 17.
http://1.221.63.146:10007/lv17/golollol.zip Find LOL ID & PW ( Password use copy & Paste ) (Key 는 PW_ID 형식으로작성 ) VMWare 메모리파일이주어집니다. LOL 게임의 ID 와 Password 를찾는문제인데 실제 LOL 게임의메모리와비교하여 ID 와 Password 를획득하였습니다. Level 18.
http://1.221.63.146:10007/lv18/sample.apk APK를분석하여보면 JNI 라이브러리와링크되어있습니다. 해당 JNI 라이브러리를분석해보면 decrypt라는사용되지않는함수가존재합니다. c언어로 ARM 리눅스용으로컴파일을하여해당함수를호출해 Log를통해 Key를얻었습니다. int main( int argc, char** argv ) { typedef void (*Decrypt)(); void* plibrary = dlopen( "/data/libjniconnector.so", RTLD_NOW ); Decrypt pdecrypt = (Decrypt)dlsym( plibrary, "_Z7decryptv" ); } pdecrypt(); dlclose( plibrary ); return 0; Key : 0e7ebe0783_tre0c6d7aa2b15951371eee1ec5feda6a Level 19 Final Round.
http://1.221.63.146:10007/lv19/hack-me.apk 해당안드로이드어플리케이션은비밀번호를입력받아체크를하는어플리케이션입니다. 입력받은비밀번호는 Java 단에서체크를하는게아닌외부 JNI 라이브러리를통해체크하였습니다. IDA를사용하여해당라이브러리를분석하였습니다. 위와같은부분이비밀번호를비교하는핵심부분입니다. var_c = 입력핚 Password var_14 = Static Key Table var_18 = 중갂에서생성되는 Key Table var_10 = 1 ~ strlen( var_c ) gdb 를통해 Key Table 들의값들을찾은뒤 c 언어로따로코딩을하여답을 얻을수있었습니다.
void main() { char* pkeytable0 = "\xb4\x79\xc5\xd2\xaf\x20\x9f\xce\xe0\x20..."; char* pkeytable1 = "\x03\x12\x29\x44\x5f\x66\x8d\x90\xbb\xca... ; for( int i = 0; i < 14; i++ ) { for( int j = 0x21; j < 255; j++ ) { if( pkeytable0[ i ] == pkeytable1[ j - 0x21 + i ] ) { printf( "%c", j ); break } } } } printf( "\n" ); Key : 4RM_1s_g0od!!!