전체 글 35

파이썬 for-else, while-else

이번 포스팅은 파이썬에 있는 문법 중 하나인 for-else, while-else 문에 대한 소개입니다. 대부분 프로그래밍 언어 상에서 'if' 키워드 다음에 'else'를 쓸 수 있는 것을 알고 계실겁니다. 하지만 파이썬에서는 'for', 'while' 키워드 뒤에도 'else'를 쓸 수 있습니다. for, while과 함께 쓰이는 else는 반복문이 break 등으로 끊기지 않고 끝까지 수행되었을 때 실행됩니다. 아래는 예제 코드입니다. num_list = [1, 2, 3, 4, 5] isExist = False for i in num_list: if i < 0: isExist = True break if isExist: print('음수가 존재함') else: print('음수가 존재하지 않음') ..

코딩/Python 2024.01.18

더 해킹 챔피언십 주니어 2023(DSEC 2023) 문제 풀이 및 후기

이번 10월 21일에 열린 '더 해킹 챔피언십 주니어 2023'에 참여하여 본선에 진출하였다. 우리 팀은 2 문제를 풀고 간신히 본선에 진출할 수 있었고, 풀었던 문제와 아쉽게 못 푼 문제를 정리하겠다. BBBBB (crypto) from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import os BLOCK_SIZE = 16 KEY = os.urandom(BLOCK_SIZE) try: with open('flag.txt', 'rb') as f: FLAG = f.read() except: FLAG = b'flag{test_flagggggggggggggggggggggggggggggggggggggggggggggggggggggggg..

CTF 2023.10.30

iron_golem 문제 풀이

코드 분석 쿼리를 실행하였을 때 에러가 발생하면 exit(mysqli_error($db)); 를 통해 에러를 출력해준다. 또한 pw의 값을 정확히 알아내어야 문제를 풀 수 있게끔 되어있다. 공격 기법 mysql에서는 if문을 사용하여서 조건이 참이 되었을 때, 다음 쿼리를 실행하는 구문이 존재한다. 해당 특징을 통해 비밀번호의 길이에 대한 조건문이 참이 되었을 때, 에러가 발생하는 쿼리를 실행하도록 주입하여보자. ' or if(length(pw) '#') 조건이 참이되어 "Subquery returns more than 1 row"라는 에러가 발생하였다. 1부터 증가시키며 pw의 길이가 32라는 것을 알아내었고, 해당..

xavis 문제 풀이

코드 분석 pw에 'regex', 'like' 라는 문자열이 있는지 검사한다. 공격 기법 ASCII() 함수를 사용해서 Blind SQL Injection을 시도하였지만 값이 제대로 나오지 않았다. 그래서 ASCII() 대신 HEX() 함수를 사용하여 pw의 Length를 측정해보았다. ' or length(hex(pw)) = 24 #' HEX() 함수를 통해 한 자리씩 알아내보면 0000c6b00000c6550000ad73 이러한 값이 나오고, 유니코드의 형식처럼 생겨서 한글 유니코드를 사이트에 검색해보면, Hangul Syllables — Unicode Character Table Hangul Syllables — Unicode Character Table Hangul Syllables 가ac00 각..

nightmare 문제 풀이

코드 분석 pw의 길이는 최대 6까지만 입력받을 수 있고, #과 -를 필터링하고 있어 다른 주석 방법을 찾아야 한다. 공격 기법 mysql에서 주석을 표현하는데 있어서는 #과 -- 이외에도 ;%00 을 이용할 수 있다. 또한 (거짓=거짓) = 참 이라는 원리를 이용하여 pw=('')=0 을 해주면 조건문의 결과는 참이 된다. ')=0;%00 (%00은 한 글자로 인식) 이렇게 딱 길이가 6인 payload를 주입해주면 문제가 풀린다.

zombie_assasin 문제 풀이

코드 분석 id와 pw를 받아서 모두 addslashes() 함수에 전달하고, 그 반환값으로 strrev() 함수에 전달하여 그 결과값을 저장한다. addslashes() 함수는 ' (싱글 쿼터), " (더블 쿼터), \ (백슬래시), NULL 문자가 있다면 바로 앞에 \ (백슬래시)를 붙여주어 sql injection 방지를 도와주는 함수 중 하나이다. 또한 strrev() 함수는 문자열로 받은 인자를 뒤집어서 반환하는 함수이다. 공격 기법 우선 id 입력값으로 escape를 시도하기 위해 ' (싱글 쿼터)를 입력해보면 ' -> addslashes() = \' -> strrev() = '\ 가 되어 이런 쿼리가 완성되어 escape가 되지 않는다. 여기서 위의 addslashes() 함수의 설명을 다시..

succubus 문제 풀이

코드 분석 id와 pw 두 문자열 모두 따옴표가 있는지 체크한다. 공격 기법 따옴표가 필터링되어 있어 escape가 불가능해 보이지만, '\' (역슬래시)를 이용하면 뒤에 오는 따옴표를 문자로 처리할 수 있다. 자세한 설명 만약, id에 \ 를 주입하게 되면 무슨 일이 생기는지 알아보자 \로 인해 바로 뒤에 있는 싱글 쿼터가 id와 비교하는 문자열을 닫아주지 않고, 실제 문자 '로 받아들여 뒤에 있는 and pw = ' 까지 id와 비교하는 문자열로 치환된다. 이제 pw에 or 1 # 을 주입한다면 아래와 같은 쿼리가 완성되어 참을 반환할 것이다.

assasin 문제 풀이

코드 분석 pw를 입력받아 like 구문 안에 주입된다. 또한 쿼리의 결과값 중 id가 'admin'이어야 solve가 된다. 공격 기법 싱글 쿼터가 필터링되어 escape를 할 수는 없고 like 구문 안에서 해결해야 한다. mysql의 like에서는 우리가 흔히 알고 있는 '%' 문자 말고도 '_' 문자를 사용할 수 있다. 이는 정규표현식에서 '.'와 같은 역할을 하는데, 이는 임의의 문자를 뜻한다. 따라서 '_'를 추가해가며 비밀번호의 길이를 알아낼 수 있을 것이고, 한 글자씩 직접 지정하여 admin의 pw를 알아낼 수 있을 것이다.