sunshine wrongbytes 시행착오

2018. 4. 8. 23:190x07 CTF/[스스로 푼 것]

728x90

결국 풀진 못했다.


소요 시간 : 문법 구글링 + 에러 해결 구글링 + 코드 작성 + 알고리즘 작성 : 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