power-girl0-0

[pwnable] coin1 풀이 본문

War game/pwnable.kr

[pwnable] coin1 풀이

power-girl0-0 2022. 3. 11. 02:22
728x90

 

안녕하세용!! *^____^*


1. 문제

이번 문제에서는 nc 접속 정보를 주고, 접속 시 위조지폐 찾는 게임이 시작된다.

 

2. 풀이

위 문제를 봤을 때, 조건은 아래와 같다.


  1. 가짜 동전을 100번 찾아야함. 

  2. N이 동전개수이고, c가 시도 횟수를 의미함.
  3. 위조지폐 맞출 때마다, n과 c는 새로운 값을 갖고 있음.
  4. input으로 인덱스를 순서대로 넣었을 시, 
     무게의 합산으로 output됨.
  5. 인덱스 0부터 시작임.
  6. 위조지폐의 무게만 9값을 가지고 있음.
  7. 시간제한이 존재함.

즉, 해결방안은 아래와 같다.


  1. 이진탐색을 이용해서, 시간을 절약한다.
     ( 참고 : https://power-girl0-0.tistory.com/559?category=777937 )

  2. 추출된 무게 합산을 나누기 10했을 때, 
     나머지가 0인 경우 위조지폐가 없고, 나머지가 9인 경우 위조지폐가 존재함을 알 수 있다.

이어서, 4번 pwntool을 보도록 하자!

3. 풀기 전, 시도

(1) 시도

c언어로 9가 존재하는 인덱스를 찾아 추출하는 코드를 작성해보았다. 

#include <stdio.h>

int main(){

	int a[] = {10,10,10,10,10,10,10,10,10,10,10,10,10,9,10,10,10};
	int key = 9;
	int start = 0;
	int end = (sizeof(a)/sizeof(int))-start;
	int mid = 0;

	while((a[mid])!= key){
		mid = (end+start)/2;
		printf("  mid index : %d, num : %d\n",mid, a[mid]);
        
        int extra = 0;
		int num = 0;

        for(int i=start; i<mid; i++){
            num+=a[i];
        }
        printf("  plus num : %d\n\n", num);

        if((num%10)==0){
            start = mid;
        }else{
            end = mid;   
        }
	}
	printf("\n  find %d key index : %d\n", a[mid], mid);

	return 0;
}

 

(2) 실행결과

 

4. pwntool을 이용한 풀이

from pwn import *

r = remote("127.0.0.1", 9007)
r.recvuntil("- Ready? starting in 3 sec... -")

for i in range(100):

    r.recvuntil('N=')
    n = int(r.recvuntil(' '))  
    r.recvuntil('C=')
    c = int(r.recvuntil('\n'))
    print("[{}] n : {}, c : {}".format(i, n, c))

    start = 0
    end = n-1
    mid = 0

    for k in range(c):
        mid = (start+end)//2
        in_str = ''
        
        for k in range(start, mid+1):
            in_str += (str(k)+' ')

        r.sendline(in_str)
        ans = int(r.recvline())

        if (ans%10)==9:
            end = mid
        else:
            start = mid+1
    
    r.sendline(str(end))
    r.recvline()

    print("[{}] find : {}".format(i, mid)) 
    print("\n----------------------\n")

r.interactive()

※ 참고 : 로컬보다 pwnable.kr로 원격접속해서, 코드를 실행하면 빠르게 flag를 확인할 수 있다.

5. flag 획득


 

잘못되거나 부족한 부분이 있다면 댓글 남겨주세요~!
피드백은 언제나 환영입니다~~( •̀ ω •́ )✧

728x90

'War game > pwnable.kr' 카테고리의 다른 글

[pwnable] lotto 풀이  (0) 2022.03.17
[pwnable] blackjack 풀이  (0) 2022.03.16
[pwnable] cmd2 풀이  (0) 2022.02.21
[pwnable] cmd1 풀이  (0) 2022.02.20
[pwnable] mistake 풀이  (0) 2022.02.16
Comments