본문 바로가기
시스템 해킹/pwnable.kr

[Pwnable.kr] coin1

by L3m0n S0ju 2021. 7. 28.



문제 규칙은 다음과 같습니다. 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()

 


플래그

 

'시스템 해킹 > pwnable.kr' 카테고리의 다른 글

[Pwnable.kr] lotto  (0) 2021.07.28
[Pwnable.kr] blackjack  (0) 2021.07.28
[Pwnable.kr] shellshock  (0) 2021.07.27
[Pwnable.kr] input  (0) 2021.07.27
[Pwnable.kr] random  (0) 2021.07.27

댓글