Ошибка типа: невозможно использовать строковый шаблон для байтоподобного объекта с помощью re.findall()

#python #html #regex #python-requests #re

#python #HTML #регулярное выражение #python-запросы #python-re

Вопрос:

Я начинаю решать программирование CTFS на Python, когда столкнулся с проблемой автоматизации математических вычислений для получения флага.

Исходный код страницы приветствия выглядит следующим образом:

 <html>

<head>

    <meta charset="utf-8">
    <title>FastMath</title>

</head>
<body>

<div id="content" style="text-align: center;">

Can you solve the level 1?<br/><h3><div id='calc'>1   1</div></h3><br/>
<form action="play.php" method="post">
 <input type="text" name="res" />
 <input type="submit" value="OK">
</form>
</div>
</body>
  

Я написал свой код на Python для его автоматизации, чтобы получить флаг следующим образом

 #!/usr/bin/env python
import requests
import re
encoding = 'utf-8'
url = '0.0.0.0:8091'
session = requests.Session()

response = session.get(url)
content = response.text

while True:
    try:
        #solves = re.findall('Can you solve the level (.*) ?', content)[0]
        number =  re.findall('(?:[0-9 ()] [* /-]) [0-9 ()] ', content)[0]

        post_url = url   '/play.php'
        solution = eval(number)
        post_data = { "res" : solution }

        response = session.post(post_url, data = post_data)
        content = response.content

        #debug
        print(content)
        #print('number of solves: '   solves)
    except:
        flag = re.findall('FLAG{(.*)}', content)[0]
        print(flag)
        break
  

Ему удается выполнить первое вычисление, как я понимаю, Можете ли вы решить уровень 2? и отправляет, как я вижу из выходных данных, но затем выдает ошибки:

 b'<html>nn<head>nnt<meta charset="utf-8">nt<title>FastMath</title>nn</head>n<body>nnt<div id="content" style="text-align: center;">nttCan you solve the level 2?<br/><h3><div id='calc'>1 - 5</div></h3><br/>tt<form action="#" method="post">nttt<input type="text" name="res" /></p>nttt<p><input type="submit" value="OK"></p>ntt</form>nt</div>n</body>nn'
Traceback (most recent call last):
  File "mmm.py", line 14, in <module>
    number =  re.findall('(?:[0-9 ()] [* /-]) [0-9 ()] ', content)[0]
  File "/usr/lib/python3.6/re.py", line 222, in findall
    return _compile(pattern, flags).findall(string)
TypeError: cannot use a string pattern on a bytes-like object

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "mmm.py", line 27, in <module>
    flag = re.findall('LMFRCTF{(.*)}', content)[0]
  File "/usr/lib/python3.6/re.py", line 222, in findall
    return _compile(pattern, flags).findall(string)
TypeError: cannot use a string pattern on a bytes-like object
  

Я попытался преобразовать все это в строку, но это не сработало, даже использование r"something" or b"something" не очень помогло!

Комментарии:

1. re.findall возможно, вы не возвращаете нужный объект.

2. Существуют ли другие альтернативы для использования в этом случае?

Ответ №1:

response.text даст вам a str , а не byte s , но response.content даст вам byte s .

Выберите тип, который вы хотите использовать, и используйте его последовательно.

re будет обрабатывать байты, если регулярное выражение byte также равно s .