당신은 당신의 손에 약간의 금화를 주었습니다.
그러나 그것들중 하나의 위조지폐가 있다.
가짜 동전은 진짜 동전과 똑같이 생겼다.
그러나 그것의 무게는 실제와 다르다.
진짜 동전은 무게가 10이고, 위조 동전은 무게가 9이다.
저울로 위조지폐를 찾는 것을 도와줘.
위조지폐 100개를 발견하면 포상금을 드립니다:)
파이, 60초 남았어.
- 게임 방법 -
1. 동전 수(N)와 기회 수(C)를 받습니다.
2. 그런 다음 무게를 측정할 동전의 색인 번호 집합을 지정합니다.
3. 체중 정보를 얻습니다.
4. 2~3회 C시간 반복하면 답이 나온다.
- 예 -
[서버] N=4 C=2 #2 시험판 2개 동전 4개 중 위폐 찾기
[고객] 01 # 무게 1동전과 2동전
[서버] 20 # 스케일 결과 : 20
[고객] 3 # 무게 4동전
[서버] 10 # 스케일 결과 : 10
[고객] 2위 위조지폐 3위!
[서버] 정답!
- 준비됐나요? - 3초 후에... -
위조지폐찾기
진짜 동전무게 = 10
위조 동전무게 = 9
N=동전수 C=기회
N을 던지면 N+1의 무게를 알려준다.
A B C D E를 던지면 총 무게합을 알려줘서 10의 배수가 안되면 그 구간에 가짜 동전이 있다는것으로 판별된다.
from pwn import *
context.log_level = "debug"
def init_data():
p.recvuntil("N=")
N = int(p.recvuntil(" "))
p.recvuntil("C=")
C = int(p.recvuntil("\n"))
return N, C
def BinarySearch(N_list, C):
lower = 0
upper = len(N_list) - 1
count = C
while lower < upper:
middle = (lower+upper)/2
payload = "".join([str(_)+str(" ") for _ in N_list[lower:middle+1]])
p.sendline(payload)
count = count - 1
log.info("send data : "+payload)
log.info("chance : "+str(count))
if int(p.recvuntil("\n")) == (len(N_list[lower:middle+1]) * 10) :
lower = middle + 1
else:
upper = middle
if lower == upper:
find_data = lower
for c in range(count+1):
p.sendline(str(find_data))
p = remote("pwnable.kr", 9007)
p.recvuntil("sec... -\n\t\n")
coin = 0
while coin < 100:
N, C = init_data()
N_list = [data for data in range(N)]
log.info("N="+str(N)+", C="+str(C))
BinarySearch(N_list, C)
coin = coin + 1
p.interactive()
코드는 참고했다. rninche01.tistory.com/entry/pwnablekr-coin1
b1NaRy_S34rch1nG_1s_3asy_p3asy
'Write-Up > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] lotto 풀이 (0) | 2021.03.24 |
---|---|
[pwnable.kr] blackjack 풀이 (0) | 2021.03.24 |
[pwnable.kr] shellshock 풀이 (0) | 2021.03.21 |
[pwnable.kr] leg 풀이 (0) | 2021.03.20 |
[pwnable.kr] flag 풀이 (0) | 2021.03.19 |