[Wargame.kr] plz variable 풀이 (644p)
Wargame/wargame.kr

[Wargame.kr] plz variable 풀이 (644p)

nc wargame.kr 10004 plz variable

Can you find the solution quickly in polynomials?

이번 문제도 삽으로 열심히 팠다.

 

먼저 서버에 들어가면 연립방정식 문제가 주어진다.

Submit format은 a,b,c,d... 를 오름차순 한 거고..

a,b,c,d... 는 정수고, $ 100\leq a,b,c,d... \leq1000 $란다.

참고로 미지수의 범위를 정해주지 않으면 푸는데 시간이 오래 걸린다.

우리 머리로 저런 연립방정식은 당연히 못 푸니까.. 파이썬한테 시켜보자.

 

연립방정식을 풀어주는 파이썬 라이브러리 numpy, z3중 z3를 선택했다.

대충 적어본 z3로 연립방정식을 푸는 튜토리얼이다.

from z3 import *

a = Int('a')
b = Int('b')
ss = Solver()

ss.add(a + b == 10)
ss.add(a - b == 4)

ss.check() #해를 구하는 데 성공 시, 'sat' return
print ss.model() #해 출력
rroot@kali:~/wargame.kr/plz# python ttest.py
[a = 7, b = 3]

이 정도면 대충 감이 오지 않는가?

여기서 주의해야 할 점은, 문제에서 주어지는 format은 다음과 같다.

h + f - d * e - c + b - g + a = -536765

add 함수에는 str type이 아니라 수식을 넣어야 한다.

또한, =이 아닌 ==을 넣어야 하기 때문에, pwn 라이브러리의 recvuntil을 잘 이용해보자.

 

나는 정작 답은 구해놓고 괜히 어렵게 생각해 삽질한 케이스다.

분명히 문제에서는 오름차순으로 정렬해 send 하라고 했는데..

만약 정렬 전 값이, a:1, b:3, c:2면 1,2,3을 send 하라는 줄 알고.. 아니면 a,c,b를 보낸다던가..

알고 보니, 그냥 알파벳 순서대로 보내란 거였다.

 

풀이에 사용한 코드는 다음과 같다. 원래 썼던 주석은 모두 삭제하고 올리도록 하겠다.

from pwn import *
from z3 import *

p = remote('wargame.kr', 10004)
ss = Solver()

for i in range(0,7):
    p.recvline()

for w in range(0,30):
	a = Int('a')
	b = Int('b')
	c = Int('c')
	d = Int('d')
	e = Int('e')
	f = Int('f')
	g = Int('g')
	h = Int('h')
	ss.add(a >= 100 , a<=1000)
	ss.add(b >= 100 , b<=1000)
	ss.add(c >= 100 , c<=1000)
	ss.add(d >= 100 , d<=1000)
	ss.add(e >= 100 , e<=1000)
	ss.add(f >= 100 , f<=1000)
	ss.add(g >= 100 , g<=1000)
	ss.add(h >= 100 , h<=1000)
	arr = []
	r_arr = []

	tmp_arr = p.recvuntil('=')
	tmp_sum = p.recvline()[1:]

	cnt = 0
	cnt += tmp_arr.count('+')
	cnt += tmp_arr.count('-')
	cnt += tmp_arr.count('*')

	com_arr = tmp_arr + '= ' + tmp_sum
	ss.add(eval(com_arr))
	print com_arr
	for i in range(0,cnt):
	    tmp_arr = p.recvuntil('=')
	    tmp_sum = p.recvline()[1:]
	    com_arr = tmp_arr + '= ' + tmp_sum
	    print com_arr
	    ss.add(eval(com_arr))

	print "Calculating..."
	ss.check()

	for i in range(0,cnt+1):
	    arr.append(str(ss.model()[eval(chr(97+i))]))
        
	arr = ','.join(arr)
	p.recvuntil('Answer ->')
	print arr
	p.sendline(arr)
        p.recvline()
	ss.reset()
    
print p.recvline()
print p.recvline()

'Wargame > wargame.kr' 카테고리의 다른 글

[Wargame.kr] 현재 상황  (0) 2020.08.06
[Wargame.kr] baskin game 풀이 (697p)  (0) 2020.08.05
[Wargame.kr] adm1nkyj 풀이 (479p)  (0) 2020.08.03
[Wargame.kr] pw_crack 풀이 (514p)  (0) 2020.08.03
[Wargame.kr] counting query 풀이 (474p)  (0) 2020.08.02