KoreanHackerTeam
Moderator
一、MISC
1.sudoku_easy
간단한 스도쿠 상호 작용,주의를 기울여야 할 몇 가지 작은 포인트, 각 레벨이 전송 된 후 5 초 후에 수면이 수면으로 반환됩니다.
모양이 비슷합니다
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
800103720
023840650
410006008
300001062
000052407
072060090
160000375
205019846
000030000
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
스도쿠를 해결하기 위해 2 차원 배열로 변환하고 리턴 결과를 멀티 라인 문자열로 재구성하십시오.
def parse_input (input_list) :
보드=[]
input_list:의 행의 경우
nums=list (map (int, row))
Board.Append (Nums)
리턴 보드
def format_output (보드) :
형식=''
보드 :의 행
형식 +=''.join (map (str, row)) + '\ n'
return formatted.strip ()
처음에는 5 점을 얻을 때마다 120 점을 얻어야했고 24 번 범위가 있었지만 계속 문제가 발생했다고 생각했습니다. 나중에, 나는 점수가 증가한 것을 발견했다. 동시에 디버깅을하고 120 점을 얻으면 getshell을 반환 할 것이므로 범위를 7 번 수정했다는 것을 알았습니다.
최종 스크립트 :
def find_empty (보드) :
범위의 행 (9) :
범위의 COL (9) :
보드 [row] [col]==0: 인 경우
ROW ROW, COL
반환 없음
DEF IS_VALID (보드, NUM, POS) :
행, col=pos
범위 (9) :의 I의 경우
보드 [row] ==num and col!=i: 인 경우
거짓을 반환하십시오
보드 [col]==num and row!=i: 인 경우
거짓을 반환하십시오
box_row=행 //3
box_col=col //3
IN RANGE (Box_row * 3, Box_row * 3 + 3) :
범위 내 J의 경우 (Box_Col * 3, Box_Col * 3 + 3) :
보드 [j]==num 및 (i, j)!=pos: 인 경우
거짓을 반환하십시오
진실을 반환하십시오
Def Solve (보드) :
find=find_empty (보드)
찾지 못한 경우 3:
진실을 반환하십시오
else:
행, col=찾기
I의 경우 범위 (1, 10) :
if is_valid (보드, i, (행, col)) :
보드 [행] [col]=i
SOLVE (보드) : 인 경우
진실을 반환하십시오
보드 [행] [col]=0
거짓을 반환하십시오
def parse_input (input_list) :
보드=[]
input_list:의 행의 경우
nums=list (map (int, row))
Board.Append (Nums)
리턴 보드
def format_output (보드) :
형식=''
보드 :의 행
형식 +=''.join (map (str, row)) + '\ n'
return formatted.strip ()
# input_string='' '-------------------
# 800103720
# 023840650
# 410006008
# 300001062
# 000052407
# 072060090
# 160000375
# 205019846
# 000030000
# --------------------------
# 이제 당신에게 : '' '을 줘
# lists=input_string.split ( '\ n') [1:10]
# 보드=parse_input (목록)
# 인쇄 (보드)
# SOLVE (보드)
# 인쇄 (보드)
PWN 가져 오기 *
# 연결을 만듭니다
Conn=Remote ('47 .108.165.60 ', 27539)
# 환영 메시지를받습니다
범위 (7) :의 I의 경우
msg=conn.recvuntil ( '입력 :'). strip (). decode ( 'utf-8')
인쇄 (MSG)
# 선택을 보내십시오
conn.sendline ( '1'.encode ())
# 다음 프롬프트를받습니다
msg=conn.recvuntil ( '레벨 :'을 선택하십시오). Strip (). decode ( 'UTF-8')
인쇄 (MSG)
conn.sendline ( '5 '.encode ())
msg=conn.recvuntil ( 'clock start'). strip (). decode ( 'utf-8')
인쇄 (MSG)
Time.sleep (5)
msg=conn.recvuntil ( '지금 당신에게 solve:'). strip (). decode ( 'utf-8')
인쇄 (MSG)
lists=msg.split ( '\ n') [1:10]
보드=parse_input (목록)
해결 (보드)
SOLVED=Format_output (보드)
conn.sendline (solved.encode ())
conn.interactive ()
또는
PWN 가져 오기 *
def is_valid (보드, 행, 콜, num) :
# 줄이 합법적인지 확인하십시오
범위 (9) :의 I의 경우
보드 [row] ==num: 인 경우
거짓을 반환하십시오
# 열이 합법적인지 확인하십시오
범위 (9) :의 I의 경우
보드 [col]==num: 인 경우
거짓을 반환하십시오
# 아홉 번째 광장이 합법적인지 확인하십시오
start_row=(행 //3) * 3
start_col=(col //3) * 3
범위의 i (3) :
범위 (3) :의 J의 경우
if Board [start_row + i] [start_col + j]==num:
거짓을 반환하십시오
진실을 반환하십시오
def solve_sudoku (보드) :
범위의 행 (9) :
범위의 COL (9) :
보드 [row] [col]==0: 인 경우
범위 (1, 10) :의 NUM 용
IS_VALID (보드, 행, COL, NUM) :
보드 [행] [col]=num
SOLVE_SUDOKU (보드) : 인 경우
진실을 반환하십시오
보드 [Row] [col]=0 # 백 트래킹
Return False # 모든 숫자가 시도되었고 적절한 숫자가 발견되지 않았습니다.
진실을 반환하십시오
def print_sudoku (보드) :
a=''
범위의 행 (9) :
범위의 COL (9) :
a +=str (보드 [행] [col])
a+='\ n'
반환 a.strip ()
context.log_level='디버그'
P=원격 ('47 .108.165.60 ', 23479)
p.recv ()
범위 (7) :의 I의 경우
p.sendline ( '1')
p.recvuntil ( '레벨 :을 선택하십시오')
p.sendline ( '5')
a='-------------------- \ nnow you solve:'
content=p.recvuntil (a) .decode (). split (a) [0] [-130:]
Sudoku=content.split ( '----------------------------------
Sudoku=sudoku.strip ()
Sudoku=sudoku.split ( '\ n')
tmp=[]
Sudoku:의 Sudo의 경우
a=[sudo의 s에 대한 int (s)]
TMP. Append (a)
SOLVE_SUDOKU (TMP) : 인 경우
결과=print_sudoku (TMP)
log.info (결과)
rine의 경우 split ( '\ n') :
P.Send (라인)
#content=p.recv (). decode ()
p.interactive ()
별도의 스도쿠 암호 해독 스크립트 :
클래스 스도쿠 () :
def __init __ (self, sudo_ku_data) :
Isinstance (sudo_ku_data, list) :이 아닙니다
RaineError (f'sudo_ku_data params는 목록이 있어야하지만 {sudo_ku_data}는 {type (sudo_ku_data)} ')입니다.
len (sudo_ku_data)!=9 또는 len (sudo_ku_data [0])!=9:
유형 상승 (
f'sudo_ku_data params는 9*9 목록이어야하지만 {sudo_ku_data}는 {len (sudo_ku_data)}*{len (sudo_ku_data [0]} list '입니다.
self.sudo_ku=sudo_ku_data
# 기존 데이터를 각 행에 저장하십시오
self.every_row_data={}
# 각 열의 기존 숫자
self.every_column_data={}
# 3*3 숫자마다
self.every_three_to_three_data={}
#각 빈 위치
self.vacant_position=[]
# 숫자는 각 빈 위치에서 시도했습니다
self.every_vacant_position_tried_values={}
# 데이터 초기화
self._init ()
def _add_row_data (자체, 행, 값) :
'' ''
초기화시
self.every_row_data에 데이터를 추가하십시오

: 파람 값 :
:return:
'' ''
welf가 아닌 경우 .every_row_data:
self.every_row_data [row]=set ()
셀프의 가치가있는 경우 .every_row_data [row] :
RaineError (f'params {self.sudo_ku}는 잘못된 스도쿠입니다.)
self.every_row_data [row] .add (value)
def _add_column_data (자체, 열, 값) :
'' ''
초기화시
self.every_column_data에 데이터를 추가하십시오

: 파람 값 :
:return:
'' ''
열이 아닌 경우. every_column_data:
self.every_column_data [column]=set ()
welf.every_column_data [column] :의 값
RaineError (f'params {self.sudo_ku}는 잘못된 스도쿠입니다.)
self.every_column_data [열] .add (value)
def _get_three_to_three_key (자체, 행, 열) :
'' ''
3*3 키를 얻으십시오


:return:
'' ''
[0, 1, 2] :에서 줄인 경우
[0, 1, 2] : 인 경우
키=1
[3, 4, 5] :의 ELIF 열
키=2
else:
키=3
[3, 4, 5] :의 Elif Row
[0, 1, 2] : 인 경우
키=4
[3, 4, 5] :의 ELIF 열
키=5
else:
키=6
else:
[0, 1, 2] : 인 경우
키=7
[3, 4, 5] :의 ELIF 열
키=8
else:
키=9
리턴 키
def _add_three_to_three_data (자체, 행, 열, 값) :
'' ''
초기화시
self.every_three_to_three_data에 데이터를 추가하십시오


: 파람 값 :
:return:
'' ''
key=self._get_three_to_three_key (행, 열)
키가 아닌 경우 자체가 아닌 경우
self.every_three_to_three_data [key]=set ()
self.every_three_to_three_data [key] .add (value)
def _init (self) :
'' ''
들어오는 스도쿠를 기반으로 데이터를 초기화하십시오
:return:
'' ''
행의 경우, 열거 (self.sudo_ku) :의 row_datas
열의 경우 열거 (row_datas) :의 값
value=='':
self.vacant_position.append ((행, 열))
else:
self._add_row_data (행, 값)
self._add_column_data (열, 값)
self._add_three_to_three_data (행, 열, 값)
def _judge_value_is_legal (자체, 행, 열, 값) :
'' ''
당사자가 배치 한 데이터가 합법적인지 확인


: 파람 값 :
:return:
'' ''
#이 데이터 행에 값이 존재합니까?
셀프의 가치가있는 경우 .every_row_data [row] :
거짓을 반환하십시오
#이 데이터 열에 값이 존재합니까?
welf.every_column_data [column] :의 값
거짓을 반환하십시오
# 가치이 3*3 궁전이 존재합니까?
key=self._get_three_to_three_key (행, 열)
welf.every.every_three_to_three_data [key] :
거짓을 반환하십시오
진실을 반환하십시오
def _calculate (self, allant_position) :
'' ''
계산, 스도쿠에 값을 놓기 시작하십시오

:return:
'' ''
# 현재 위치를 얻으십시오
행, 열=Vacant_position
값=set (범위 (1, 10))
# 현재 위치에서 시도한 데이터를 저장하려면 현재 위치에 대한 고유 키를 만듭니다.
key=str (행) + str (열)
#이 키가 존재하면 차이 세트를 가져옵니다. 둘 다 세트이므로 직접 사용하십시오.
self.every_vacant_position_tried_values:의 키 인 경우
값=값- self.every.every_vacant_position_tried_values [key]
#이 키가 존재하지 않으면 빈 컬렉션을 만듭니다.
else:
self.every_vacant_position_tried_values [key]=set ()
값의 값 :
# 현재 위치에서 시도 된 데이터에 현재 데이터 추가
self.every_vacant_position_tried_values [key] .add (value)
# 현재 값이 합법적 인 경우 배치 할 수 있습니다.
self._judge_value_is_legal (행, 열, 값) :
# print (f'set {vacant_position} 값은 {value} ')