CTF/MISC

HackCTF - 달라란 침공

달라란 침공은 Pwntool이 아직 익숙하지 않을 때 시도하면 좋은 문제이다.

만약 문제를 못 풀어 보신분은 삽질을 하더라도 혼자서 시도해보길 바란다.

Writeup

 


Information

nc를 접속하면 다음과 같은 화면이 나온다.

이 중 하나를 선택하여 입력해주면

다음과 같이 간단한 연산 문제가 나오고 문제를 맞히면 다음 문제가 나온다.

이 문제는 Pwntlool을 이용하여 데이터를 뽑아낸 후에 연산 후 결과 값을 보내주면 되는 문제이다.

 

Code

코드가 좀 개떡이라 죄송합니다..

문제는 달라란 은행, 보라빛 요새, 달라란 거리 3개의 챕터? 가 있으며 각 챕터는 다음과 같다.

  • 달라란 은행
    • '+', '-' 연산
    • 20문제
  • 보라빛 요새
    • '*', '/' 연산
    • 30문제
  • 달라란 거리
    • '+', '-', '*', '/' 연산
    • 40문제
from pwn import *
context.log_level = 'debug'
p=remote("ctf.j0n9hyun.xyz",9003)
​
p.sendlineafter("input )",'1')
​
for i in range(20):
    p.recvuntil("\x0a")
    if (i!=0):
        p.recvuntil("\x0a")
    x = int("".join(p.recvuntil('\x20')[0:-1]),10)
    A = p.recvn(1)
    y = int(p.recvuntil('\x0a')[1:-1],10)
    if (A == '+'):
        p.sendline(str(int(x+y)))
    if (A == '-'):
        p.sendline(str(int(x-y)))
​
p.sendlineafter("input )",'2')
for i in range(30):
    p.recvuntil("\x0a")
    if (i!=0):
        p.recvuntil("\x0a")
    x = int("".join(p.recvuntil('\x20')[0:-1]),10)
    A = p.recvn(1)
    y = int(p.recvuntil('\x0a')[1:-1],10)
    if (A == '*'):
        p.sendline(str(int(x*y)))
    if (A == '/'):
        p.sendline(str(int(x/y)))
​
p.sendlineafter("input )",'3')
for i in range(40):
    p.recvuntil("\x0a")
    if (i!=0):
        p.recvuntil("\x0a")
    x = int("".join(p.recvuntil('\x20')[0:-1]),10)
    A = p.recvn(1)
    y = int(p.recvuntil('\x0a')[1:-1],10)
    if (A == '*'):
        p.sendline(str(int(x*y)))
    if (A == '/'):
        p.sendline(str(int(x/y)))
    if (A == '+'):
        p.sendline(str(int(x+y)))
    if (A == '-'):
        p.sendline(str(int(x-y)))
p.interactive()