Pwnablekr coin1 Write Up
0. Introduce
푸는데 생각보다는 오래걸렸습니다. (2시간정도 걸린것 같습니다) 요즘 신입생들 C언어를 가르치면서 작년에 C언어 문제풀 때 달팽이모양으로 배열짜면서 재미있었던 기억이 났는데 이 문제를 풀면서 그런 C언어 문제들을 푸는 느낌을 받아서 나름 재미있었습니다.
1. Problem
nc 포트가 주어진다.
nc포트에 접속하면 다음과 같은 말들이 나온다.
해석을 해보면 가짜동전은 9의 무게를 가지고 진짜동전은 10의 무게를 가져서 그것들을 0 ~ N까지 번호를 부여하고 가짜동전을 찾는 문제였다.
주어진건 N(동전의 총 개수)과 C(무게를 잴 수 있는 횟수)이며 총 100번 똑같이 해서 가짜동전 100개를 찾아야한다.
2. Solve
내가 짠 알고리즘은 생각보다 단순하다. (포너블 문제가아니라 코딩문제에 가깝다..)
먼저 총 동전의 개수는 100개라고 가정한다. (횟수에는 신경을 쓰지 않았다.)
0. st = 0, end = 100
1. st부터 st + (end - st) / 2까지의 합을 구한다. ( = 0번 ~ 50번의 동전의 합 )
2-1. 위 합이 10으로 나누어 떨어지면 st = st + (end - st) / 2을 넣어준다. ( st = 50, end = 100 )
2-2. 위 합이 10으로 나누어 떨어지지 않으면 end = end - (end - st) / 2 을 넣어준다. ( st = 0, end = 50 )
3. st와 end의 차이가 1이 될 때까지 반복한다.
처음에는 저렇게 짜고자 하지 않았으나 계속 수정하다보니까 저런식으로 구현하게 되었다.
[Full Code]
(https://github.com/LYoungJoo/WarGame_WrteUp/blob/master/pwnablekr/coin.py)
3. Flag