2018. 4. 8. 23:19ㆍ0x07 CTF/[스스로 푼 것]
결국 풀진 못했다.
소요 시간 : 문법 구글링 + 에러 해결 구글링 + 코드 작성 + 알고리즘 작성 : 7시간 40분(대회 끝나버림)
문제 요구사항 : / 안에 무작위로 파일과 디렉터리가 생성. 디렉터리가 생성되어 있다면 디렉터리를 탐색 허나 그 디렉터리에 또 다른 디렉터리가 있다면 또 다시 탐색 ... 모든 디렉터리를 탐색 후 /로 돌아와서 send . 라는 명령어를 입력하면 플래그 획득.
느낀 점 : 동적프로그래밍에서 소켓을 이용하는 방법은 조금 익숙해진듯 함. 허나, 파이썬 문법에 대한 이해도가 현저히 부족함.
파이썬 코드 디버깅하는 방법도 조금 알아야 할 필요성이 있음
무엇보다 코드가 상당히 더러움.
다음 CTF에서는 동적프로그래밍 2시간 이내에 푸는 것을 목표로.
이 문제를 통해 만들어진 나만의 과제 : 실제 리눅스의 디렉터리 하나를 기준점으로 삼고, 동적프로그래밍을 제작해보기.
코드는 상당히 더러움..
from pwn import *
import re
r = remote('chal1.sunshinectf.org',30001)
s = "start"
ls = "ls"
send = "send ."
cd = "cd "
back = "cd .."
_round = 0 # round에 따라 문자열 자르는걸 다르게 해야하더라
_len=0
return_list = [] # 계속 증가 시켜줘야하고, 빼주기도 해야함
def BackPath(return_list): # 성공적으로 잘 들어감
# print target
return_list.pop()
print "remain" + str(return_list)
#r.sendline(back)
return return_list
# r.sendline(back)
def send_message(_list,_len):
recv = cd+_list[_len-1]
print "current"
print recv
# print_path()
return recv
# 모듈로 묶어야 한다..최대한 자연스럽게 이쁘게 !!
# get_replace_word()
# align_text(_list,_len)
def get_replace_word(): #round가0일때 3번째 round가 1일 때 5번째 round2일때 8번째
tmp = r.recvline()
tmp = tmp.split(' ')
# print tmp
tmp[-2] = tmp[-2].replace("(","")
list_del = tmp.pop(-2)
_len = list_del
# print _len
return _len
def print_path():
print r.recvline()
def align_text(new_list,list_del): # 이따가 함수로 쓰려면 리스트 까지 매개변수로 줘야할ㄷ스한데..
cnt = int(list_del) # 매개변수를 int로 변환
new_list = [] # 계속 추가 해야함 그래서 전역변수
list_cnt = 0 # list의 cnt로 사용
j = 0
file_cnt = 0
while True: # 무한 반복
# arr = r.recvuntil(i'\n')
arr = r.recvline()
arr = arr.split(' ') # 우선 개행으로 나눈 다음
cnt = cnt-1 # 그 후 반복문 감소
#''.join(arr.split())
if 'DIR' in arr: # 문장에 DIR이있다면
tmp = arr.pop(0) # dir 관련 명 추출
new_list.append(tmp) # tmp를 new_list라는 리스트에 추가
list_cnt += 1 # dir있는 문장 수 카운트 (나중에 반복문에 사용하기 위함)
if(cnt == 0):
for i in new_list: # dir 적혀있는 놈들을 이용할 것임
st = "".join(i) # 리스트를 문자열로 변경한다
return_list.append(st)
#test(st) # 문자열 삽입
# 이 문자열을 가지고 새로운 함수에 접근
j += 1
_len = len(return_list)-1
if(len(return_list) != 0): # return_list의 길이가 0이 아니면
# 계속 반복해야함
#print return_list[_len]
break
#send_message(return_list,_len)
# 만약 dir이 적혀있지 않은 리스트라면?
if 'FILE' in arr:
print"list_del : %d , file_cnt : %d"%(list_del,file_cnt)
file_cnt += 1
if(file_cnt == list_del):
print "FILE FILE!!"
#r.recvuntil('\n')
BackPath(return_list)
r.sendline(back)
#_len -= 1
file_cnt = 0
break
else:
continue # 루트 다시 돌고
# 여기위치에 break걸면 while문 탈출하게 됨
#break
#
response = r.recvuntil('begin.')+r.recvuntil('\x0a')
arr = []
result = 1
r.sendline(s) #start instruction
r.sendline(ls) # use instruction ls -> print directory and file in current path.
while True:
list_del = get_replace_word() # 각 라운드당 출력되는 문장 갯수(파일,디렉터리)
list_del = int(list_del)
align_text(arr,list_del) # align_text함수 유지보수 필요함..리스트를 계속 추가해줘야 함 새로 들어갈 때 마다
recv = send_message(return_list,_len)
r.sendline(recv)
r.sendline(ls) # 리스트 출력을 해야 문자열을 주울 수 있띠
#print r.recvline()
r.sendline(back)
# print 'current array'
print return_list
return_list.pop()
# print r.recvline()
r.sendline(send)
r.interactive()
'0x07 CTF > [스스로 푼 것]' 카테고리의 다른 글
sunshine password writeup (0) | 2018.04.08 |
---|---|
sunshine hackername writeup (0) | 2018.04.08 |
swamp CTF return (0) | 2018.04.01 |
swamp CTF journey (0) | 2018.04.01 |
swamp CTF adventure (0) | 2018.04.01 |