Do you like math?

nc 104.154.120.223 8083

Краткость — сестра таланта. Именно так думали те, кто делал описание к этому заданию. Ок, открываем кали, выполняем предложенную команду и действительно, нам всё сразу становится понятно:

root@kakali:~# nc 104.154.120.223 8083

#######   ###            #####   #####           
#        #   #   #   #  #     # #     #          
#       #     #   # #         #       #    ##### 
######  #     # #######  #####   #####           
      # #     #   # #   #       #          ##### 
#     #  #   #   #   #  #       #                
 #####    ###           ####### #######          
                                                 
>>>  
root@kakali:~# 
root@kakali:~# 
root@kakali:~# nc 104.154.120.223 8083

  #    #####           #####    ###            
 ##   #     #  #   #  #     #  #   #           
# #   #         # #         # #     #    ##### 
  #   ######  #######  #####  #     #          
  #   #     #   # #         # #     #    ##### 
  #   #     #  #   #  #     #  #   #           
#####  #####           #####    ###            
                                               
>>> 
root@kakali:~# 

Очевидно, нужно много раз послать ответ с верным решением, но мы ограничены во времени ответа. И да, есть ещё одна маленькая проблема… Как это распарсить?!
В голову приходят страшные слова «нейронная сеть, распознавание изображений», так, стоп. Должно быть проще. Гуглим «python text to ascii art», гуглим ещё, больше гугла. И так или иначе все наши изыскания приводят к либе pyfiglet.
В голову закрадывается ещё одна не особо умная мысль.
Тестируем найденную либу, всё круто, переводит текст в ascii art. На гитхабе этой либы находим список поддерживаемых шрифтов. И да, начинаем перебирать все возможные шрифты. Ура, достаточно быстро находим нужный, который юзают создатели таска! Пол дела сделано.

import pyfiglet
from pyfiglet import Figlet

custom_fig = Figlet(font='banner')
print(custom_fig.renderText( "Test"))
print(custom_fig.renderText( "11+9 ="))
root@kakali:~# python3 numb.py 
#######                     
   #    ######  ####  ##### 
   #    #      #        #   
   #    #####   ####    #   
   #    #           #   #   
   #    #      #    #   #   
   #    ######  ####    #   
                            

  #     #          #####           
 ##    ##     #   #     #          
# #   # #     #   #     #    ##### 
  #     #   #####  ######          
  #     #     #         #    ##### 
  #     #     #   #     #          
##### #####        #####           
                                   

root@kakali:~# 

Собственно сама идея. Немного поизучав ответы сервера понимаем, что формат примера следующий: одна или две цифры, символ +, или *, одна или две цифры, пробел, знак равно. И у нас есть используемый шрифт. Так почему бы нам не создать все возможные комбинации примеров, перевести это всё в ascii art и далее искать пример среди кучи наших вариантов?
Сказано — сделано. Генерируем все возможные варианты:

import itertools

sym = ["-","+","*"]
alph = []
all_variants = [p for p in itertools.product([1,2,3,4,5,6,7,8,9,0], repeat=2)]

for s in sym:
    for n1 in all_variants:
        for n2 in all_variants:
            alph.append(str(int(str(n1[0])+str(n1[1]))) + s + str(int(str(n2[0])+str(n2[1]))))

Переводим это всё в ascii:

final_alph = []
for n in alph:
    final_alph.append((custom_fig.renderText(n + " ="), n))

Ну и собственно всё. Коннектимся к серверу, принимаем пример (опытным путём установлено, что нужно принять 9 строк), ищем пример среди всех наших вариантов, высчитываем ответ и шлём.
Весь код выглядит так:

from pwn import *

import pyfiglet
import itertools
from pyfiglet import Figlet

custom_fig = Figlet(font='banner')
sym = ["-","+","*"]

alph = []
all_variants = [p for p in itertools.product([1,2,3,4,5,6,7,8,9,0], repeat=2)]

for s in sym:
    for n1 in all_variants:
        for n2 in all_variants:
            alph.append(str(int(str(n1[0])+str(n1[1]))) + s + str(int(str(n2[0])+str(n2[1]))))

final_alph = []
for n in alph:
    final_alph.append((custom_fig.renderText(n + " ="), n))

conn = remote('104.154.120.223',8083)
while True:
    fin_line = ""
    for i in range(0,9):
        try:
            line = conn.recvline().decode('utf-8')
            print(line)
        except EOFError:
            line = conn.recvall().decode('utf-8')
            print(line)
        fin_line += line

    print(fin_line)

    for l in final_alph:
        if l[0] in fin_line:
            print(l[1])
            res_n = eval(l[1])
    conn.sendline(str(res_n))

Запускаем, ждём, получаем флаг:
Флаг: ISITDTU{sub5cr1b3_b4_t4n_vl0g_4nd_p3wd13p13}


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *