본문 바로가기
포너블(pwnable)/CTF(pwnable.kr)

[Toddler's Bottle] coin1

by LIZ0904 2021. 5. 6.
반응형

coin1 문제

오늘의 문제는 nc pwnable.kr 9007로 넘어가면 된다

 

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 명령을 친 후, 다음과 같은 코드를 넣어 파이썬 파일을 하나 만들어주었다.

코드는 어디에서 복붙해왔으나 어케 실행하는 질 모르겠다 계속 오류난다 얄루~

 

실패!

 

참고

dongdd.tistory.com/145

 

[pwnable.kr] coin1

[pwnable.kr] coin1 Problem 게임을 하고 싶다는 말이 써져있고 nc로 접속할 수 있는 프로그램 하나가 주어져있었다. 앞 문제들과는 달리 소스 코드나 ssh로 접속할 수 있는 상황은 아니었다. nc를 통해 접

dongdd.tistory.com

 

 

 

 

반응형

댓글