오늘의 문제는 nc pwnable.kr 9007로 넘어가면 된다
nc를 통해 접속하고 나면 게임 하나가 나온다.
<게임 설명> 황금 동전 중에 하나의 가짜동전을 찾는 게임이다. 가짜동전은 진짜동전 무게와 다르며, 진짜동전의 무게는 10, 가짜동전의 무게는 9이다. 가짜 동전을 100번 찾는 것이 목표이며, 이를 찾게 되면 플래그(reward)를 얻을 수 있다.
<게임 방법> 1. 코인의 개수(N)과 시도횟수(C)가 주어진다. 2. 그 후 저울에 올릴 동전의 번호를 입력한다. 3. 무게에 대한 정보를 얻게 된다. 4. 2~3번을 시도횟수(C)만큼 반복하고, 정답을 입력한다. <예시> [Server] N=4 C=2 #4개의 코인이 있고, 2번의 기회가 있다. [Client] 0 1 #첫번째와 두번째 동전의 무게를 잼 [Server] 20 #무게의 결과는 20 [Client] 3 #네번째 동전을 저울에 올린다. [Server] 10 #무게 결과는 10 [Client] 2 #가짜 동전은 세번째 [Server] 정답입니다~ |
접속한 후 일정 시간이 지나면 N과 C의 값이 주어진다.
동전의 순서는 인덱스로 이루어져 있어서 0~(N-1)까지의 순서이다.
이 문제를 해결하기 위해서 Binary Search, 즉 이진탐색을 이용했다. 이진탐색을 이용해 9가 나올 때까지 찾는다.
Binary Search의 비교횟수는 logN이다.
from pwn import *
p = remote("pwnable.kr",9007)
print p.recv()
for j in range(100):
print p.recvuntil("N=")
a = int(p.recvuntil(" "))
print p.recvuntil("C=")
b = int(p.recvuntil("\n"))
print b
low = 0
high = a
cnt = 0
while cnt != b :
cnt = cnt + 1
snd = ""
mid = (low+high)/2
for i in range(low,mid):
snd += str(i)
snd += " "
snd += str(mid)
print snd
p.sendline(snd)
a = int(p.recv())
print a
if a % 10 == 9 :
high = mid
else:
low = mid + 1
mid = (low+high)/2
p.sendline(str(mid))
print str(mid)
print p.recv()
print p.recv()
vi pwntool.py 명령을 친 후, 다음과 같은 코드를 넣어 파이썬 파일을 하나 만들어주었다.
코드는 어디에서 복붙해왔으나 어케 실행하는 질 모르겠다 계속 오류난다 얄루~
실패!
참고
[pwnable.kr] coin1
[pwnable.kr] coin1 Problem 게임을 하고 싶다는 말이 써져있고 nc로 접속할 수 있는 프로그램 하나가 주어져있었다. 앞 문제들과는 달리 소스 코드나 ssh로 접속할 수 있는 상황은 아니었다. nc를 통해 접
dongdd.tistory.com
'포너블(pwnable) > CTF(pwnable.kr)' 카테고리의 다른 글
[Toddler's Bottle] lotto 문제풀이 (0) | 2021.05.07 |
---|---|
[Toddler's Bottle] blackjack 문제풀이 (0) | 2021.05.07 |
[Toddler's Bottle] mistake 문제풀이 (0) | 2021.04.28 |
[Toddler's Bottle] leg 문제풀이 (0) | 2021.04.28 |
[Toddler's Bottle] input 문제풀이 (0) | 2021.04.07 |
댓글