반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 구현
- 백준
- ascii_easy
- samsung research
- dfs
- Deadlock
- exec
- Brute Force
- 삼성리서치
- pwnable.kr
- 삼성기출
- paging
- 백트래킹
- BFS
- 스케줄링
- 운영체제
- 프로세스
- fork
- 컴공복전
- 동기화문제
- 김건우
- 데드락
- 알고리즘
- higunnew
- 시뮬레이션
- Memory Management
- 완전탐색
- 가상메모리
- BOJ
- segmentation
Archives
- Today
- Total
gunnew의 잡설
pwnable.kr 11. coin1 본문
반응형
글 쓰다가 날아가서 화가 난다. 이번 글은 짧게 써야겠다. 별로 어렵지도 않다.
nc pwnable.kr 9007로 접속하면 가짜 동전 찾기 게임이 나온다. 문제를 읽어보니 딱 봐도 이분 탐색(Parametric Search) 문제이다. 그런나 이 게임을 100번을 통과해야 하는데 제한 시간은 60초이다. 딱봐도 뭔가 Exploitation Code를 작성해서 해결해야 겠다는 생각이 들지 않는가? 사람 손으로 1분 안에 깬다는 것은 불가능하다.
1. Parametric Search |
이분 탐색 코드이다. while문의 제한은 C번이다. left는 0, right는 N으로 시작하며 계속해서 범위를 절반으로 줄여 나간다.
left = 0
right = N
cnt = C
mid = -1
while cnt != 0:
cnt -= 1
s = ""
# left부터 mid까지의 sequence를 만듦
mid = (left + right) / 2
for j in range(left, mid):
s += str(j)
s += " "
s += str(mid)
print(s)
# sequence를 보내서 돌아오는 답은 해당 코인들의 무게 합
p.sendline(s)
weight = int(p.recv())
print(weight)
# 무게 합의 일의 자리가 9이면 가짜 코인이 left ~ mid 중에 있다는 것임
if weight % 10 == 9:
right = mid
# 아니면 mid + 1 ~ right 중에 가짜 코인이 있음
else:
left = mid + 1
# 답은 mid에 있음
mid = (left + right) / 2
p.sendline(str(mid))
2. Exploitation Code |
지난 7강에서 input 문제를 해결할 때 pwntool을 활용하여 해결했던 기억이 있을 것이다. 이번 문제는 훨씬 쉬우니 코드만 보고도 각 문장이 무슨 일을 하는지 이해할 수 있을 것이다.
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
38
39
40
41
42
|
from pwn import *
p = remote('pwnable.kr', 9007)
print(p.recv())
for j in range(100):
print(p.recvuntil("N="))
N = int(p.recvuntil(" "))
print(p.recvuntil("C="))
C = int(p.recvuntil(" "))
left = 0
right = N
cnt = C
mid = -1
while cnt != 0:
cnt -= 1
s = ""
mid = (left + right) / 2
for j in range(left, mid):
s += str(j)
s += " "
s += str(mid)
print(s)
p.sendline(s)
weight = int(p.recv())
print(weight)
if weight % 10 == 9:
right = mid
else:
left = mid + 1
mid = (left + right) / 2
p.sendline(str(mid))
print("Stage " + str(j) + " clear!!")
print(str(mid))
print(p.recv())
print(p.recv())
|
cs |
해결
반응형
'System Security' 카테고리의 다른 글
pwnable.kr 13. lotto (0) | 2020.02.17 |
---|---|
pwnable.kr 12. blackjack (0) | 2020.02.17 |
pwnable.kr 10. shellshock (0) | 2020.02.14 |
pwnable.kr 9. mistake (Operator priority) (0) | 2020.02.12 |
pwnable.kr 8. leg (ARM Assembly) (0) | 2020.02.12 |
Comments