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