dalgorithm
달공의 개발기
dalgorithm
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • Back-end (0)
    • Java (11)
    • 자료구조 (7)
    • Network (31)
    • Database (9)
    • Baekjoon Online (24)
    • 클라우드 (6)
    • Android (15)
      • Kotlin (14)
    • AI (27)
      • Machine Learning&Deep Learn.. (27)
    • Web (23)
      • Webhacking (17)
      • WebProgramming (6)
    • 기술면접 (1)
      • JAVA&자료구조 (0)
      • Spring (0)
      • 컴퓨터구조&운영체제 (0)
      • 네트워크 (0)
      • 데이터베이스 (0)
    • CTF 스터디 (15)
    • 대외활동 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 네트워크
  • db
  • 코드리뷰
  • cs
  • gcp
  • 데이터베이스
  • 포너블
  • 침입탐지
  • CTF
  • 머신러닝
  • python #백준
  • 딥러닝
  • 클라우드
  • 인공지능
  • 자바
  • 자료구조
  • 웹해킹
  • java
  • kotlin
  • Guacamole

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dalgorithm

달공의 개발기

[pwnable.kr] 11번_coin1 풀이
CTF 스터디

[pwnable.kr] 11번_coin1 풀이

2021. 5. 3. 21:25
728x90

포너블 11번 coin1 문제를 풀어볼 것이다.

 

네트워크 응답이 너무 느리다면 nc 0 9007을 시도해보라고 한다.

별다른 방법은 없어보였고, nc로 적힌 넷캣 서버 접속을 하라고 되어있다.

 

접속하게 되면 "Shall we play a game?"이라는 문구가 제일 먼저 나타난다.

문장을 해석해보면 우리의 손에 금화가 몇개 있는데 위조된 동적이 있다고한다. 

그러나 생긴 것은 진짜와 매우 동일하고 무게가 진짜와 다르다고 한다.

100개의 위조된 동전을 찾는다면, 이기게 되는 게임이다.

 

실제 동전 무게가 10이고, 위조 동전 무게가 9인 점을 기억해야한다.

- How to play -

1. 당신은 N개의 동전 갯수와 C번의 기회를 얻는다.

2. 그러면 동전들의 index 번호를 지정하여

3. 무게 정보를 얻어야한다.

4. 2~3회 C시간 동안 반복하고 당신은 답을 줘야한다.

 

예를 들어, N = 6 이다 하면, 0 1 2 3 4 5 이렇게 동전이 있는 것이다.

내가 0, 3, 5번 코인을 선택해서 0 3 5 라고 입력해서 보내면

0 3 5 코인의 무게를 합해서 알려준다.

 

 

- Solution -

파이썬의 pwn 툴을 이용해 작성된 코드이다. 무게의 합이 10의 배수인지 아닌지 브레이크 타임을 주면서 계속 체크하여 모든 경우의 수를 대입하게 된다. 소스코드는 아직 전체 직접 작성은 쉽지 않아, 깃허브에서 가져와 풀이를 보았다.

코드를 보며 해석하는 방식으로 공부를 진행하였다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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()
Colored by Color Scripter
cs

 

위와 같이 코드를 작성해주고 실행해주면 아래와 같이 결과를 확인할 수 있다.

 

b1NaRy_S34rch1nG_1s_3asy_p3asy

728x90

'CTF 스터디' 카테고리의 다른 글

[pwnable.kr] 13번_lotto 풀이  (0) 2021.05.12
[pwnable.kr] 12번_blackjack 풀이  (0) 2021.05.12
[pwnable.kr] 10번_ shellshock 풀이  (0) 2021.05.03
[pwnable.kr] 9번_ mistake 풀이  (0) 2021.04.23
[pwnable.kr] 8번_ leg 풀이  (0) 2021.04.23
    'CTF 스터디' 카테고리의 다른 글
    • [pwnable.kr] 13번_lotto 풀이
    • [pwnable.kr] 12번_blackjack 풀이
    • [pwnable.kr] 10번_ shellshock 풀이
    • [pwnable.kr] 9번_ mistake 풀이
    dalgorithm
    dalgorithm

    티스토리툴바