시스템 해킹/pwnable.kr

[Pwnable.kr] coin1

L3m0n S0ju 2021. 7. 28. 14:08



문제 규칙은 다음과 같습니다. N은 코인의 수를 의미하고 C는 남은 기회를 나타냅니다. C번의 기회안에서 N개의 코인중 몇번째 코인이 가짜 코인인지 맞춰야하는데 해당 루틴을 100번 돌려야합니다. 즉 60초 안에 수동으로는 불가능하므로 알고리즘을 작성해야합니다. 주어진 기회를 잘보면 log_2(N) 보다 크므로 이진검색을 통해 정답을 추출할 수 있습니다. 현재 pwnable.kr 서버 네트워크 속도가 느리기 때문에 이전 문제 shellshock ssh를 통해 서버에 접근하여 /tmp에 폴더를 만들어 해당 폴더에 파이썬 코드를 작성하여 로컬에서 실행해야 시간안에 모든 문제를 풀 수 있습니다. 익스플로잇 코드는 아래와 같습니다.

 

from pwn import * 
r = remote("127.0.0.1", 9007) 
r.recvuntil('- Ready? starting in 3 sec... -') 
for j in range(100): 
    r.recvuntil('N=') 
    N = int(r.recvuntil('C=').split(' ')[0]) # N 추출
    C = int(r.recvuntil('\n').split('\n')[0]) # C 추출
    print("N: "+str(N)+", C: "+str(C)) # N, C 출력
    low = 0 
    high = N - 1 
    for t in range(C): 
        mid = (low + high) // 2 // 중간값 계산
        payload = "" 
        for i in range(low, mid + 1): 
            payload += str(i) + " " 
        r.sendline(payload) 
        add = int(r.recvline()) 
        if add % 10 == 9: 
            high = mid 
        elif add % 10 == 0: 
            low = mid + 1 
    r.sendline(str(high)) // 결국 정답은 high로 수렴하게됨
    print(r.recvline()) 
r.interactive() 
r.close()

 


플래그