728x90
이번 포스트에서는 Pwnable의 coin1 문제에 대해 다루겠다.
문제는 다음과 같다.
## 문제 해석 :
가짜 코인을 찾는 문제이다. N는 동전의 갯수이며 C는 시도 가능 횟수이다. 총 100개의 가짜 코인을 찾으면 flag를 획득할 수 있는 것으로 보인다.
해당 문제는 이진탐색 알고리즘을 통해 쉽게 해결할 수 있다.
## 문제 풀이 :
우선 임의의 정수를 넣어서 시도해보겠다.
임의의 정수 "50"을 넣었을 때 "50"의 무게값이 출력된 것을 확인할 수 있다. 이어서 "1", "2", "3", "4"를 넣었을 때 네 가지 수의 무게값의 합이 출력된 것을 확인할 수 있다.
이어서 이진탐색을 활용하여 공격코드를 작성해보겠다.
## 최종 결과 :
### 공격 코드 :
from pwn import *
PORT = 9007
REMOTEHOST = "127.0.0.1"
r = remote(REMOTEHOST, PORT)
r.recvuntil('- Ready?')
for k in range(100):
r.recvuntil('N=')
N = int(r.recvuntil(' '))
r.recvuntil('C=')
C = int(r.recvuntil('\n'))
print("N : {} C : {}".format(N, C))
low = 0
high = N - 1
for t in range(C):
mid = low + (high - low) // 2
payload = ""
for i in range(low, mid + 1):
payload += str(i) + " "
r.sendline(payload)
ret = int(r.recvline())
if ret % 10 == 9:
high = mid
elif ret % 10 == 0:
low = mid + 1
r.sendline(str(high))
print(r.recvline())
r.interactive()
r.close()
*** 참고로 해당 문제는 실행 속도 때문에 로컬이 아닌 pwnable 서버에 실행을 해야지 재시간에 flag를 획득할 수 있다. 필자는 pwnable의 첫 번째 문제인 fd에 접속하여 폴더를 생성한 다음에 해당 공격 코드를 실행하였다.
### 실행 결과 :
Flag = b1NaRy_S34rch1nG_1s_3asy_p3asy
'Wargame > Pwnable' 카테고리의 다른 글
Pwnable (13. lotto) (0) | 2022.07.11 |
---|---|
Pwnable (12. blackjack) (0) | 2022.07.10 |
Pwnable (10. shellshock) (0) | 2022.07.08 |
Pwnable (9. mistake) (0) | 2022.07.07 |
Pwnable (8. leg) (0) | 2022.07.06 |