제15회순천향대학교청소년정보보호페스티벌 (15th Youth Information Security Festival) 문제풀이보고서 한국디지털미디어고등학교 3 학년이름: 이태양 ( 뮤쀼)
[ WEB 50 ] 페이지를들어가서주석을보면페이지에 고써져있다. view-source GET인자를줬을때소스를보여준다 소스를보니까 $_COOKIE[ id ] 가 admin 이면플래그를주는데검사하기전에 $_COOKIE[ id ] 이 admin 이면 exit 한다. 근데그사이에있는 $_POST를 extract 하는거때문에검사하고나서 $_COOKIE[ id ] 를덮어 씌울수있으므로 POST 로 _COOKIE[id]=admin 넣어서보내주면플래그를준다. flag : YISF{B3ep-Be3p-8eep...Pu5hung...F14g} [ WEB 100 ] 처음에는 sqli인줄알고막쿼리넣으면서삽질하다가안돼서고민하다가영어페이지가왜 있지하구소스들을살펴봤다. (ko로리다이렉트안될라고 view-source: 해서소스코드로봄) 그렇게보면서어쩌다가영어사이트에서회색양말결제를해봤는데 400 원밖에안나갔다. 그러고한국사이트에서환불하는데 500원줘서 100원이득이생긴걸보고아이거다싶어서 파이썬으로스크립트짜서돌렸다. 처음에스크립트좀돌려서적당량돈을모으고 10000원짜리사고파니까 2000원씩모여서 그걸로슥슥돈모아서플래그샀다. 스크립트소스는 https://gist.github.com/5unkn0wn/a8d54f14e506b4ada5abcc69473ebeb1 여기있다. flag : YISF{y0u_c2n_f1nd_the_f1a9_just_do_it}
[ WEB 150 ] 일반유저로로그인해서 admin페이지보면리다이렉트가되는데맨윗줄에자바스크립트로 만리다이렉트시키는코드있고밑에어드민페이지코드는다있어서좀보다가 join 할때 히든파라미터를 admin으로조작하면 admin 계정으로조인된다는거를깨닫고조인을했다. 그러고여기저기 sqli해보다가안돼서다른문제풀다가커맨드인젝션힌트나와서커맨드 인젝션을했다. 처음에는인젝션이안됐는데중요한게파일을삭제할때 system( rm $filename ); 이런식으로구현이되어있어서그런지파일이름을 으로감싸 서 `sleep 5`.jpg 인가 ;sleep 5;.jpg 로해봤는데인젝션이성공했다. 다행히 stdout을삭제성공했다고 OK뜰때같이출력해줘서결과를바로바로볼수있어서 그나마편했다. 근데필터링이몇개걸려있어서조금까다로웠다. 특히 / 를필터링하는바람에디렉토리들 을탐색하기에좀불편했는데 ;ls../../; 가아니라 ;cd..;cd..;ls; 이렇게하면 / 없이디렉 토리들에뭐가있는지볼수있기때문에이렇게여기저기돌아다니면서플래그위치를찾았 다. 플래그경로는 /var/www/html/you_want/fla9/fla9981 이경로에있다. flag : YISF{Y0u_Rec3ived_A_r3ward} [ WEB 200 ] 150 점보다훨씬쉬웠다. 사이트를들어가서주석을보면역시소스를볼수있는방법을알 려준다. 소스가엄청간단했는데 $_GET[ page ] 에 logout이라는문자열이있으면그페이지를
include 한다. 아무필터링없이 include하기때문에 php wrapper 를이용해서소스를릭할수있다.?page=php:// filter/convert.base64-encode/resource=logout/../contents 을넣으면서 contents 의소스를릭할수있다. 이렇게하면 릭해서로그인소스를보면 username 이 'YWRtaW4' 를 base64디코딩한거고 password가 'WUlTRnsyNmIwZDcxOTE3NDIwZmVkZGI3Y jjjyjy2zmzimgeznx0' 로로그인을시켜준다. 비밀번호를디코딩해보면 디코딩한거면 logout admin으 플래그가적혀있다. 패딩이안맞아서 invalid input 도같이뜨는데상관은없다. flag : YISF{26b0d71917420feddb7b2cb66ffb0a35} [ FORENSIC 50 ] 까 게시판이라고했으니까 FTK Imager로열어서 Appdata에서크롬쪽을뒤져서방문기록보니 http://nonamed.xyz 에접속해서글을남겼다는것을알수있다. 게시판이라서 sqli해봤는데먹히지는않고 id pw 모두찾아내야할거같아서크롬로그인데 이터복호화해볼라고안간힘을쓰다가접었는데힌트에 해야한다고해서 IE PassView 툴써서얻었다. ie 브라우저로그인데이터복호화 컴퓨터비밀번호는 SYSTEM이랑 SAM 파일에서 NTLM해쉬추출해서크랙해봤는데 empty pasasword 라고해서그냥공백으로냅뒀다. ( 크롬데이터복호화하려고크랙시도한건데 왜크롬데이터는복호화가안된건지모르겠다ㅠㅠ.) 로그인해서잠겨있는게시글을보면플래그가있다.
flag : YISF{SOme7imes_W3bBr0w5er_St0r3d_y0uR_Pa$$worD!} [ FORENSIC 100 ] 문제를풀려고하니이미힌트들이다떠먹여주고있었다. 구글에 windows mail app location 치니까글에서 여기에있대서 FTK Imager 로열여서가보니까있었다. 처음에는한글인코딩이돼있어서몰라봤는데힌트도또올라오고해서 파일인것을깨달았다..dat파일들이메일.dat 파일들이여러개있는데추출해서몇개보니까중요한파일이라면서구글드라이브링크 하나주고문서비밀번호도다른메일에서알려준다. (I_am_poor_but_my_company_is_rich) 열어서보면플래그가있다. flag : YISF{S0ME_W1ND0WS_4PP_HA5_EVIDENC3_A8OUT_U5ER'S_BEHAVI0R}
[ REVERSING 50 ] 윈도우게임이다. 아이다로열어서흐름을보다가맨마지막에 고마움의표시로선물준대는데남은게함수딱하나호출하는거라서저게플래그출력해주는 거겠지하고디버깅해서 eip 를바로저함수로바꿔서호출하니까플래그가출력됐다. flag : YISF{We1Come_R3ver2ing_w0rld} [ REVERSING 100 ] 바이너리가좀더러워서분석할때짜증났는데다풀고나서보니까인증하기 끗한버전의바이너리가올라와서허무했던문제이다. 10분전에깨 바이너리가하는일은파일을읽어서앞뒤로더미문자열을 4 개만든다. 평문맨앞네글자가 문자열이어떤걸로이루어질지구성하는데 YISF 키포맷을아니까더미문자열은어떤건지알 수있었다. 그렇게문자열다섯개를이어서구성하고각문자열마다 0, 2, 4 번째바이트를 가져와서 % 11 한값으로 xor 을한다. 그러고나서첫번째문자열순서대로랑마지막문자열을역순으로 xor하고 10더하면서다시 문자열배열을바꾼다. 그리고정수형태로파일에다시저장한다.
그냥역연산하면된다. 역연산소스는 https://gist.github.com/5unkn0wn/c8bf66313f0dddad4e415f53916801d7 여기있다. flag : YISF{y0uR_4na1y$is_CApab!lity_i2_Gr3aT!} [ REVERSING 150 ] 이번에는윈도우미로게임문제이다. 아이다로분석을좀하다보면 이렇게플래그를만들것처럼생긴함수가있는데연산을살펴보면 sub_405020와 sub_405080 이리턴한값을가지고이런저런연산을한다. 저함수들을보면 이렇게내부적인비교를통해서리턴값이 0이거나 0x3F4F 이거나둘중하나로만나뉜다. 리 턴값이플래그연산에쓰이는데당연히 0x3F4F같은값이리턴돼야할것같아서무조건저 값을리턴하도록패치하고저함수를어디서호출할까디버깅하면서찾아봤다. 찾아보다가 sub_405a10 이함수에서
v8이 1이면 fail했다고띄워주는함수를호출하고 2면 clear했다면서아까그플래그연산하는 함수를호출해준다는것을알았다. 그래서디버깅하면서 clear해주는함수쪽으로분기하도 록 eip 를조작해서플래그출력하는함수로가서플래그를연산하면진짜플래그가출력된다. flag : YISF{waS_Th3_m@z3_fuN?} [ REVERSING 200 ] 바이너리를 nc를통해서받아 30 초안에키값을구해서보내야하는자동화문제이다. 바이너리를분석해보면 read로입력을받아서키체크하는함수통해서 good wrong 출력해 주는심볼릭익스큐션에최적화된바이너리임을알수있다.
check 함수는사람의손으로는역연산이힘들것같은루틴들이 이렇게들어있다. angr 를돌리면슥삭나오게생겼다. 근데 angr로슥삭나오지못하게하도록라이브러리주 소를가져온다거나 simuvex.simprocedure에구현되어있지않은 abs함수를사용한다는등 함정이파여있었다. 라이브러리주소를가져오는곳은디버깅해보니까항상최상위 1바이트인 0x7f만가져오는데 angr에서는실제라이브러리주소가들어있는것이아니기때문에후킹해서 했고 0x7f abs 는직접파이썬에서구현해서함수자체를후킹했었는데이렇게하면안됐다. 넣어주게 처음에후킹을안하면 abs는 ReturnUnconstrained되지않은라이브러리라면서오류가나길 래직접후킹을했었는데이이유가바이너리를로딩할때속도를위해서습관적으로넣어주 던 load_options={'auto_load_libs':false} 이옵션때문이었다. abs함수를내가직접후킹하는게아니라저옵션을빼서 들어가도록하면된다. angr가실제라이브러리내부까지 그렇게해서 nc로바이너리받아서후킹할주소랑 find, avoid할주소등등 angr를돌리는데 필요한정보들은 objdump로어셈파싱해서가져와서 angr 돌려서풀었다. 처음에스테이지몇까지깨야되는지몰라서당황했는데대충하나돌리는데 까 10 개라추측하고돌렸는데맞았다. 풀이코드는 https://gist.github.com/5unkn0wn/ec5ee79e244e4b34d17550eacd189dde 여기있다. 25초정도걸리니 flag : YISF{gratz_ke3p_y0ur_kul_w1th_4ngr} [ PWNABLE 50 ] 돈이 0x10000000 원이상이면플래그를준다. 조건보고아이건포맷스트링아니면인티저언더플로우일거같다하고소스를보니까
농작물을팔때현재가지고있는농작물보다큰지만검사하고 0보다작은지는검사를하지 않는다. 그래서인티저언더플로우를발생시키려고적당한아무음수나몇번넣어봤더니알 아서플래그를줬다. ( 여기서는 selling, -536871912만 4 번하면플래그를줌) flag : YISF{thanks_p1ay3r} [ PWNABLE 100 ] 이것도아이다로좀분석해보다가구현되어있는 strncpy, strncmp, strncat,... 등등의함수 에메인함수의문자열변수를인자로넣어서문자열처리를하는데문자열변수바로밑에있 는인티저변수가 0 이아닌값이되면플래그를출력해준다. 익스는필요없고버퍼오버플로우만좀내면될거같다고생각해서걍바로 nc에접속해서 모든메뉴에 AAAAAAA... 를넣어보다가 strncat에서막넣으니까갑자기플래그를출력해줬 다. 나중에보니까 strncat 함수에버퍼오버플로우취약점이있었다. flag : YISF{um!!?_i_d1d_not_kn0W_th3rE_w@s_a_buuug}
[ PWNABLE 150 ] 힙익스플로잇문제이다. 처음버퍼입력받을때 31 바이트힙오버플로우가일어난다. 그리고 구조체에포인터가존재하고그포인터를읽고쓸수있기때문에오버플로우를이용해서그 포인터를 got로덮는다면라이브러리릭과 got o verwrite를통해익스플로잇을할수있게 된다. 다만 modify할때는오버플로우가일어나지않게입력을받기때문에 chunk1 할당 --> chunk2 할당 --> chunk1 해제 --> chunk3 할당 (chunk1과같은메모 리주소) --> 오버플로우를이용해 chunk2 를덮음 이와같은순서로익스플로잇을해야한다. 라이브러리릭하고 free의 got를 syst em 으로덮고힙데이터에 /bin/sh; 를넣어서쉘을따면 된다. 익스플로잇코드 : https://gist.github.com/5unkn0wn/d2ffeffe4bfc4d32043f150e70738186 flag : YISF{go0d job_1t_was_b0f_0n_h34p_pr 0b_:)} [ PWNABLE 200 ] 이번에는소켓프로그램이다. 이것도입력받을때대놓고오버플로우를주는데카나리때문에바로익스플로잇이불가능하다. sterr 를리다이렉트시키지않아카나리를브루트포싱하는것은불가능하고내부구조체를 잘이용해서출력할때카나리를릭해야한다. 메모리구조는 [trainer][pocketmon][canary][sfp][ret] 이렇게구성되어있고각구조체는 trainer --> [name][age], pocketmon --> [name][level][comment(overflow)][stat 1, 2, 3] 이렇게구성되어있다. 포켓몬인포출력할때포켓몬이름이나코멘트같은거는길이를정해두고출력해서릭이안 되지만트레이너이름은그냥쭉출력해준다. 그래서 trainer랑 pocketmon 구조체를꽉채워 서출력시키면카나리릭을할수있다. 더불어서 sfp 에서스택릭을, ret에서라이브러리릭을 할수있다. 중간에 00을없게하기위해 trainer name 은꽉채우고 (modify 할때꽉채울수있음)
age는 1넣으면 ff ff... 로꽉채워진다. pocketmon name도꽉채우고 level을꽉채워야하는데버퍼는 int64사이즈인데비해입력은 int32로받아서상위 4바이트에 00 이들어갈수밖에없다. 이거를포켓몬게임을지면레벨을 2하는데이때는 int64로 2하기때문에레벨을 0이나 1 을넣고게임을져서버퍼를채우면된다. 그리고 comment에서 bof가터지기때문에릭을 쭉하고나머지는 ro p해서 system 을호출하면된다. 소켓이기때문에스택에 stdin, stdout, stderr를 socket 디스크립터로리다이렉트시키는 binsh를넣고 system 인자로넣으면된다. 익스플로잇코드 : https://gist.github.com/5unkn0wn/abc22e55ce1652529c94a364b6217fe9 flag : YISF{p0kem0n_g0_had_b e3n_p0pul4r_in_th1s_year_:)} [ MISC 50 ] 공지확인누르면준다. flag : YISF{H@VE_FUN_G@OD_LUCK} [ MISC 100 ] 간단한모스부호를표현한 wav 파일이다. 골드웨이브로열어서표시되는스펙트럼의길이를보고해석하면된다. 위에꺼는 -.--.......-. / -....- -. -.- / ~~~ 이렇게해석된다. flag : YISF{THANK_YOU_F0R_YOUR_H4RD_W0RK}
[ MISC 150 ] 소스로 c++ 소스를주고그소스로플래그를암호화한파일을준다. c++ 코드는템플릿을사용해서막연산을하는데 operator 들을다보면 간단한 +, -, *, ^ 밖에없다. 그래서소스는안짜고걍손으로일일이연산해줬다. 밑에서 xor도해주는데 xor 값은키포맷이 YISF{} 라는거를이용해서알아냈다. 그냥손으로다해서소스가없다. flag : YISF{v3rY_Co NFu5inG} [ MISC 200 ] qrcode 를하나주는데내부에 엄청많은 qrcode들이 apng 로구성되어있다. apng disassembler로파일싹다뽑아서디코 딩해보면 x, y, color 처럼보이는값들이출력된다. 출력되는 (x, y) 에해당색깔을넣으면플래그가들어있는 qrcode가나올것같은느낌이들
어서코드짜서만들었다. 중간에?? 로모르는값들도있었는데그부분은항상정해져있는값인 finding pattern이랑 timing pattern 부분이라서문제없이 qrcode 를만들수있었다. 소스는 https://gist.github.com/5unkn 0wn/5228a6746cb8f7e8cc263c20c6e47ff5 여기있다. 다만들어진 qrcode 는이렇게생겼다. 디코딩하면플래그가있다. flag : YISF{MAYBE_QR_CODE_CHALLENGE_m4de_y0u_4ngry_8ut_you_are_so_n1ce!!}