Pwnablekr_Toddlers Bottle_coin1

따로 소스코드를 제공하지는 않는다.

정상 코인의 무게는 10, 가짜 동전의 무게는 9이다. 주어진 N개의 동전 중 가짜 동전의 인덱스를 찾는다. C번 질문할 수 있다.

알고리즘 문제로 보인다. 이분탐색으로 절반씩 무게를 합쳐서 작은 쪽을 택하면 logN만에 찾을 수 있다.

N과 C는 실행시마다 바뀌지만 관찰해본 결과 N은 1001000, C는 910정도의 수를 반복한다. logN으로 찾기 충분해 보인다. 100문제를 풀라고 한다.

from pwn import *
 
def binarysearch(left, right):
 
    global p
    global c
 
    if(left < right):
        mid = int((left + right)/2)
 
        req = ""
        for i in range(left, mid+1):
            req += str(i) + " "
 
        p.sendline(req)
 
        res = p.recvline()
 
        if int(res)%10 ==0:
            left = mid+1
        else:
            right = mid
 
        c -= 1
        return binarysearch(left, right)
 
    elif left == right:
        return left
 
p = remote("localhost", 9007)
 
print(p.recvuntil("- Ready? starting in 3 sec... -"))
 
sleep(4)
 
for t in range(100):
    p.recvuntil("N=")
    num = p.recvline()
    num = num.split(' ')
 
    n = int(num[0])
    c = int(num[1].split("=")[1].split("\\")[0]
 
    result = binarysearch(0, n-1)
 
    for i in range(c):
        p.sendline(str(result))
    p.sendline(str(result))
 
p.interactive()

리모트에서 하면 네트워크가 너무 느려 시간 내로 풀 수 없다. pwnable.kr의 다른 SSH 계정으로 접속하여 로컬에서 실행했다.

flag는 b1NaRy_S34rch1nG_1s_3asy_p3asy 이다.


tags: writeup, pwnable, algorithm, binary search