🚩CTF
[LOB] - troll -> vampire 풀이
[LOB] - troll -> vampire 풀이
2019.10.05/* The Lord of the BOF : The Fellowship of the BOF - vampire - check 0xbfff */ #include #include main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } // here is changed! if(argv[1][46] == '\xff') { printf("but it's not forever\n"); exit(0); } strcpy(buffer, argv[1]); printf..
[LOB] - orge -> troll 풀이
[LOB] - orge -> troll 풀이
2019.10.05/* The Lord of the BOF : The Fellowship of the BOF - troll - check argc + argv hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; // here is changed if(argc != 2){ printf("argc must be two!\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still your..
[LOB] - darkelf -> orge 풀이
[LOB] - darkelf -> orge 풀이
2019.10.05/* The Lord of the BOF : The Fellowship of the BOF - orge - check argv[0] */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // here is changed! if(strlen(argv[0]) != 77){ printf("argv[0] error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1..
[LOB] - wolfman -> darkelf 풀이
[LOB] - wolfman -> darkelf 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - darkelf - egghunter + buffer hunter + check length of argv[1] */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still yo..
[LOB] - orc -> wolfman 풀이
[LOB] - orc -> wolfman 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - wolfman - egghunter + buffer hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); }..
[LOB] - goblin -> orc 풀이
[LOB] - goblin -> orc 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - orc - egghunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } strcpy(buffer, argv..
[LOB] - cobolt -> goblin 풀이
[LOB] - cobolt -> goblin 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - goblin - small buffer + stdin */ int main() { char buffer[16]; gets(buffer); printf("%s\n", buffer); } 이번 문제는 작은 크기의 buffer 에 gets() 함수로 사용자에게 입력을 받고 있다. 이전 문제 풀이와 똑같이 RTL 공격 기법을 사용할 것이다. RTL에 대한 설명은 아래 링크에 설명되어 있다. https://lactea.kr/entry/bof-Return-to-Libc-RTL-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EB%B2%95?category=866608 [bof] - Return to Libc (RTL)..
[LOB] - gremlin -> cobolt 풀이
[LOB] - gremlin -> cobolt 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - cobolt - small buffer */ int main(int argc, char *argv[]) { char buffer[16]; if(argc cobolt 문제이다. 위 코드를 보면 buffer의 크기가 16bytes로 작아진 것을 볼 수 있다. 즉, buffer에 shellcode를 넣을 수 없다는 뜻이다. 따라서 필자는 RTL 공격 기법을 사용할 것이다. RTL 공격 기법에 대한 설명은 아래 링크..
[LOB] - gate -> gremlin 풀이
[LOB] - gate -> gremlin 풀이
2019.10.04/* The Lord of the BOF : The Fellowship of the BOF - gremlin - simple BOF */ int main(int argc, char *argv[]) { char buffer[256]; if(argc < 2){ printf("argv error\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } LOB 첫번째 문제이다. buffer 변수의 크기는 256bytes 인데, strcpy에서 argv[1]의 값을 buffer로 값을 복사하는 과정에서 bof 공격이 가능하다. gdb로 분석하기 위해 gate 바이너리 파일을 복사한 후 분석을 진행하겠다. [gate@localhost gate]$ mkd..
[webhacking.kr 2019 old] - challenge 18
[webhacking.kr 2019 old] - challenge 18
2019.10.01sql injection 문제이다. 소스 보기를 하면 몇몇개의 문자들이 필터링 되어 있다.
[webhacking.kr 2019 old] - challenge 17
[webhacking.kr 2019 old] - challenge 17
2019.10.01이번 문제는 입력하는 곳이 주어지고 마찬가지로 javascript로 값을 비교하여 어떤 곳으로 요청을 보내는 문제이다. 아래 코드는 문제 내에 있는 javascript 문제이다. unlock=100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+1/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+100*10*10+1..
[webhacking.kr 2019 old] - challenge 16
[webhacking.kr 2019 old] - challenge 16
2019.10.01이번 문제의 html 코드를 보면 아래와 같이 javascript 코드가 있는 것을 볼 수 있다. document.body.innerHTML+="*"; function mv(cd){ kk(star.style.left-50,star.style.top-50); if(cd==100) star.style.left=parseInt(star.style.left+0,10)+50+"px"; if(cd==97) star.style.left=parseInt(star.style.left+0,10)-50+"px"; if(cd==119) star.style.top=parseInt(star.style.top+0,10)-50+"px"; if(cd==115) star.style.top=parseInt(star.style.top+0,..
[webhacking.kr 2019 old] - challenge 14
[webhacking.kr 2019 old] - challenge 14
2019.10.01이번 문제는 뭔가를 입력하는 곳이 있다. html 코드를 보면 javascript 코드로 어떠한 행위를 하는데, 아래 코드를 보자. function ck(){ var ul=document.URL; ul=ul.indexOf(".kr"); ul=ul*30; if(ul==pw.input_pwd.value) { location.href="?"+ul*pw.input_pwd.value; } else { alert("Wrong"); } } ul 값과 사용자가 입력한 값이랑 비교해서 같으면, GET 방식으로 요청을 보낸다. 간단하게 크롬 콘솔창에서 ul 값을 확인해 보겠다. var ul=document.URL; ul=ul.indexOf(".kr"); ul=ul*30; console.log(ul); 위 코드를 실행해보면..
[webhacking.kr 2019 old] - challenge 10
[webhacking.kr 2019 old] - challenge 10
2019.10.01위 문제의 소스 코드중 중요한 부분만 가져오면 아래와 같다. a 태그를 클릭하면 onclick 액션이 실행되는데, 왼쪽으로 1px 만큼 움직인다. 이 값이 1600px 이면 GET 방식으로 요청을 보낸다. O 이 문제를 풀기 위해서는 풀이 법이 다양하겠지만, 필자는 그냥 style 값에서 left 값을 1599px 값으로 수정한 후 a 태그를 클릭했다. 그럼 left 값은 1600px가 되고 조건에 맞게 되므로 문제가 풀리게 된다.
[webhacking.kr 2019 old] - challenge 8
[webhacking.kr 2019 old] - challenge 8
2019.10.01Access Denied!"); echo(htmlspecialchars($agent)); exit();}$db = dbconnect();$count_ck = mysqli_fetch_array(mysqli_query($db,"select count(id) from chall8"));if($count_ck[0] >= 70){ mysqli_query($db,"delete from chall8"); }$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");$ck = mysqli_fetch_array($result);if($ck){ echo "hi ".htmlentit..
[webhacking.kr 2019 old] - challenge 6
[webhacking.kr 2019 old] - challenge 6
2019.10.01위 문제의 소스코드를 보면 id와 pw값을 각각 20번씩 base64로 인코딩하고 이를 각각의 문자로 치환하는 것을 볼 수 있다. 이 문제를 풀기 위해서는 user와 password 쿠키 값이 역으로 디코딩해서 최종적으로 user는 'admin'이 , password는 'nimda'가 나와야 한다. 따라서 'admin' 과 'nimda' 이 20번 base64로 인코딩하고 치환한 값을 얻기 위해서는 위의 소스코드의 일부를 가져와 아래 처럼 수정 후 실행한다. 실행하면 아래와 같은 결과가 출력이 된다. 이를 user 쿠키과 password 쿠키에 값을 각각 넣어 수정하고 재요청 보내면 문제가 풀리게 된다.
[webhacking.kr 2019 old] - challenge 1
[webhacking.kr 2019 old] - challenge 1
2019.10.01위 문제의 소스 코드를 보면 아래와 같다. 'user_lv' 이라는 쿠키가 없을 경우 쿠키를 생성하고 값은 1로 설정한다. ---------------------
[Hacker101 CTF] Micro-CMS v1
[Hacker101 CTF] Micro-CMS v1
2019.07.15이번 문제의 힌트는 아래와 같다. Flag0 우선 Create a new page 를 클릭하여 글을 등록해보자. 등록하면 아래처럼 글이 등록 된 것을 볼 수 있다. URL을 보면 ~~~/page/14 에서 14의 의미는 아마 필자가 적은 글의 번호 일 것이다. 1 부터 시작해서 값을 늘려가다 보니 7번 글에서 아래 사진처럼 Forbidden 이 출력 된 것을 볼 수 있따. 7번 글을 보기 위해서는 글 수정 기능을 통해 우회가 가능하다 아까 필자가 작성한 13번 글로 가서 Edit this page를 누른다. 그다음 ~~~/page/edit/13 을 ~~~/page/edit/7 로 바꾼다. 아래 사진 처럼 flag 값이 뜬 것을 확인 할 수 있다. Flag1 웹은 서버측으로 인자를 전송할때 그 값을 제대로..
[Hacker101 CTF] - A little something to get you started
[Hacker101 CTF] - A little something to get you started
2019.07.15Hacker 101 CTF A little something to get you started 문제의 힌트는 아래와 같다. 문제 사이트에 들어가면 아래와 같은 문장이 나온다. 개발자 모드 => Network 로 들어가 보니 background.png 파일이 있는 것을 볼 수 있다. 해당 이미지를 보기 위해 url뒤에 /background.png 를 추가한 후 접속해보면 flag 값이 출력 되는 것을 볼 수 있다.
[CTF] - wechall Training: MySQL II 풀이
[CTF] - wechall Training: MySQL II 풀이
2019.04.10http://www.wechall.net/challenge/training/mysql/auth_bypass2/index.php [WeChall] Training: MySQL II MySQL Authentication Bypass II This one is the same as MySQL1, but you have to come up with a more advanced injection to trick this authentication. Your mission is again: Login yourself as admin. Again you are given the sourcecode, also as highlighted vers www.wechall.net 이 문제를 풀다가 괜찮은 문제여서 정리할겸 포..
HackingCamp 2019 CTF 후기
HackingCamp 2019 CTF 후기
2019.04.06HackingCamp 에는 참가를 하지 않았지만, CTF만 외부에서 참가했다. 문제 분야는 web, reversing, pwnable, porensic, misc, network, crypto, programming 이렇게 있다. web에서 usersearch 문제와 pwnable, revering을 제외한 모든 문제를 풀었다. reversing이랑 pwnable은 실력이 안되서…. 목표는 10등 안에 들기 였지만, 무리였나보다.
[HackingCamp 2019] – Plz Solveme write up
[HackingCamp 2019] – Plz Solveme write up
2019.04.06webhacking => Plz Solveme 위 파일을 다운받고 run.py 라는 파일의 소스코드를 보면 GET 방식으로 exp 라는 변수의 값을 받게 된다. # flag in /flag from flask import Flask, render_template, request, session, redirect, url_for from multiprocessing import Process import re import time import shutil import tempfile app = Flask(__name__) FLAG = 'flag is HCAMP{flag in real server, this is not flag}' @app.route('/', methods=['GET']) def main(..
[HackingCamp 2019] – what the hash write up
[HackingCamp 2019] – what the hash write up
2019.04.06web hacking => What The Hash (현재 이 글을 쓰는 시점에는 해당 문제 서버에 접속을 할 수 없는 상태이기 때문에 소스코드로만 설명을 하겠다.) 첫번째 문제의 소스는 아래와 같다. 암호화된 문자열을 md5로 복호화 하면 ‘hash’ 라는 단어가 나온다. GET 방식으로 ?hash=hash 라고 보내면 첫번째 문제는 풀린다. 두번째 문제이다. 이 문제는 magic hash 문제이다. 암호화된 문자열을 보면 0e 라고 시작하는 것을 볼 수 있다. 0e123는 수학으로 보면 0 * 10^123 = 0 이라고 볼 수 있다. 언어에서는 auto casting을 하고 php 는 int 를 비교하는 것을 선호하기 때문에 md5로 hash 했을때 0e 로 시작하는 값이 나오게끔 240610708 ..
[HackingCamp 2019] – admin write up
[HackingCamp 2019] – admin write up
2019.04.06web hacking => admin id를 입력하는 공간이 있다. admin을 입력하니 Hello 라고 출력이 되었다. guest 라고 입력하니 Hello guest 라고 출력이 되었다. 여기서 알 수 있는 것은 admin을 입력했을때 admin 이라는 값은 필터링 되어 버린다는 것을 알 수 있다. 여러 값을 입력해본 결과 admin => ” admi => ” 을 필터링 한다는 것을 알 수 있었다. 따라서 adadmimin 이라고 입력하면 flag 값이 나오게 된다. HCAMP{rls1004_is_so_cute_>_
[HackingCamp 2019] – 더 풀래구 줴눼뤠위퉈 write up
[HackingCamp 2019] – 더 풀래구 줴눼뤠위퉈 write up
2019.04.06MISC => 더 풀래구 줴눼뤠위퉈 우선 nc 로 접속하면 아래와 같이 실행이 된다. 어떤 값을 입력하면 flag 값과 flag check 값이 출력이 된다. 여기서 입력값은 예시 처럼 {“0” : 53} 이런 식으로 json 타입으로 입력을 해야 한다는 것이다. 이번 문제는 친절하게 소스코드를 올려 주었기 때문에, 위 파일의 소스 코드를 열어 보면 다음과 같다. #!/usr/bin/python3 # -*- coding: utf-8 -*- import json import string character_list = string.ascii_letters + string.digits + "_@" len_character_list = len(character_list) class FlagGenerator():..
[HackingCamp 2019] – 아아 뫄위쿠 퉤수투 write up
[HackingCamp 2019] – 아아 뫄위쿠 퉤수투 write up
2019.04.06MISC => 아아 뫄위쿠 퉤수투 위 파일을 다운 받으면 암호화된 문자열을 볼 수 있다. python 으로 base64 decode 툴을 만들어서 실행 해본 결과 flag를 얻어 낼 수 있었다. import base64 f = open('test.txt','r') data = f.read() while True: data = data.replace('\n','') data = base64.b64decode(data).decode('utf-8') if 'HCAMP' in data: print(data) break # Result # HCAMP{B4se_64_x_30_@@_XD} HCAMP{B4se_64_x_30_@@_XD}
[HackingCamp 2019] – Fun Game write up
[HackingCamp 2019] – Fun Game write up
2019.04.06MISC => Fun Game 요즘 CTF에서 스타 맵 문제가 유행인가 보다. scx 파일은 스타1 맵 파일이다. 스타1 유즈맵을 만들어본 사람으로써, “트리거”에 flag를 숨겼을 것 같아 확인 해본 결과 flag 값이 들어 있었다. HACMP{StarCraft_1s_Funfunnnnnnnnnnnnnnnnnn““““““} 오랜만에 이 유즈맵을 봐서 너무 반가웠다. 나중에 친구랑 해야지
[HackingCamp 2019] – Where write up
[HackingCamp 2019] – Where write up
2019.04.06MISC => Where….?!?!? 위 파일을 다운 받으면 어떤 장소에서 찍은 사진이 하나 주어진다. 스테가노그래피 인줄 알고 막 삽질 했지만 의미 없는 짓이었다. 그냥 해당 사진에 있는 가게 이름을 검색하여 찾아 보았지만, 나오지 않았다. 동아리 회장 도움을 받아, ‘오레시피’ 라는 가게 이름을 검색하자 주소가 나왔다. https://m.blog.naver.com/PostView.nhn?blogId=5sa11&logNo=221197985361&proxyReferer=https%3A%2F%2Fwww.google.com%2F HCAMP{dnjfemzjqqnrfh54rlf}
[HackingCamp 2019] – 나는 언젠가 플래그를 보았다. write up
[HackingCamp 2019] – 나는 언젠가 플래그를 보았다. write up
2019.04.06Network => 나는 언젠가 플래그를 보았다. 위 파일을 다운 받으면 pcap 이라는 확장자를 가진 것을 볼 수 있다. Wireshark 로 해당 파일을 열어보자. 문제 이름을 보면 ‘나는 플래그를 보았다.’ 라고 되어 있다. 의미를 해석하면, 문제 제작자는 플래그를 보았다 라는 의미로 해석되는데 이 pcap 파일 어딘가에 flag 파일이 들어 있다는 것이다. 나는 이런 문제가 나오면 무조건 처음으로 하는 방법은 Export Http 기능을 사용한다. 이 기능은 HTTP를 이용하여 주고받은 파일들을 목록으로 나열하여 유저에게 보여주는 기능이다. 아래 사진처럼 많은 파일들이 나오게 되는데, 모두 저장하여 필요한 파일이 있는지 확인한다. 저장된 파일을 보는 도중에, flag.xps 라는 파일이 있는 것을..
[HackingCamp 2019] – You_Must_Logoff write up
[HackingCamp 2019] – You_Must_Logoff write up
2019.04.06Forensic => You_Must_Logoff https://drive.google.com/open?id=19p1Nqf5hTxB7XHHBETJDwcGm673U1D_f 위 구글 공유 파일이 살아 있다면 다운 받도록 하자. 위 파일을 다운 받고 FTK Imager 툴로 분석을 했다. 포렌식 문제는 몰라서 동방에 있는 포렌식 잘하는 후배에게 도움을 받아 분석을 시작했다. 위 파일을 열면 FTK Imager에 아래와 같이 나온다. 문제를 다시 읽어보면 ‘의심 계정’, ‘Backdoor’ 를 찾는 것이다. 현재 os에서 계정을 보기 위해 home 디렉토리를 보면 5개의 계정이 존재하는 것을 알 수 있다. (여기서 backdoor를 찾는데 시간좀 걸림..) 삽질은 버리고 풀이만 보면 Waterman이라는 디렉토..