|
22 | 22 | from scapy.base_classes import Net |
23 | 23 | from scapy.compat import bytes_encode, chb, plain_str |
24 | 24 | from scapy.utils import corrupt_bits, corrupt_bytes |
25 | | -from scapy.libs.six.moves import zip_longest |
26 | 25 |
|
27 | 26 | from scapy.compat import ( |
28 | 27 | List, |
@@ -1412,115 +1411,3 @@ class CorruptedBits(CorruptedBytes): |
1412 | 1411 | def _fix(self): |
1413 | 1412 | # type: () -> bytes |
1414 | 1413 | return corrupt_bits(self.s, self.p, self.n) |
1415 | | - |
1416 | | - |
1417 | | -class CyclicPattern(VolatileValue[bytes]): |
1418 | | - """ |
1419 | | - Generate a cyclic pattern |
1420 | | -
|
1421 | | - :param size: Size of generated pattern. Default is random size. |
1422 | | - :param start: Start offset of the generated pattern. |
1423 | | - :param charset_type: Charset types: |
1424 | | - 0: basic (0-9A-Za-z) |
1425 | | - 1: extended |
1426 | | - 2: maximum (almost printable chars) |
1427 | | -
|
1428 | | -
|
1429 | | - The code of this class was inspired by |
1430 | | -
|
1431 | | - PEDA - Python Exploit Development Assistance for GDB |
1432 | | - Copyright (C) 2012 Long Le Dinh <longld at vnsecurity.net> |
1433 | | - License: This work is licensed under a Creative Commons |
1434 | | - Attribution-NonCommercial-ShareAlike 3.0 Unported License. |
1435 | | - """ |
1436 | | - |
1437 | | - @staticmethod |
1438 | | - def cyclic_pattern_charset(charset_type=None): |
1439 | | - # type: (Optional[int]) -> str |
1440 | | - """ |
1441 | | - :param charset_type: charset type |
1442 | | - 0: basic (0-9A-Za-z) |
1443 | | - 1: extended (default) |
1444 | | - 2: maximum (almost printable chars) |
1445 | | - :return: list of charset |
1446 | | - """ |
1447 | | - |
1448 | | - charset = \ |
1449 | | - [string.ascii_uppercase, string.ascii_lowercase, string.digits] |
1450 | | - |
1451 | | - if charset_type == 1: # extended type |
1452 | | - charset[1] = "%$-;" + re.sub("[sn]", "", charset[1]) |
1453 | | - charset[2] = "sn()" + charset[2] |
1454 | | - |
1455 | | - if charset_type == 2: # maximum type |
1456 | | - charset += [string.punctuation] |
1457 | | - |
1458 | | - return "".join( |
1459 | | - ["".join(k) for k in zip_longest(*charset, fillvalue="")]) |
1460 | | - |
1461 | | - @staticmethod |
1462 | | - def de_bruijn(charset, n, maxlen): |
1463 | | - # type: (str, int, int) -> str |
1464 | | - """ |
1465 | | - Generate the De Bruijn Sequence up to `maxlen` characters |
1466 | | - for the charset `charset` and subsequences of length `n`. |
1467 | | - Algorithm modified from wikipedia |
1468 | | - https://en.wikipedia.org/wiki/De_Bruijn_sequence |
1469 | | - """ |
1470 | | - k = len(charset) |
1471 | | - a = [0] * k * n |
1472 | | - sequence = [] # type: List[str] |
1473 | | - |
1474 | | - def db(t, p): |
1475 | | - # type: (int, int) -> None |
1476 | | - if len(sequence) == maxlen: |
1477 | | - return |
1478 | | - |
1479 | | - if t > n: |
1480 | | - if n % p == 0: |
1481 | | - for j in range(1, p + 1): |
1482 | | - sequence.append(charset[a[j]]) |
1483 | | - if len(sequence) == maxlen: |
1484 | | - return |
1485 | | - else: |
1486 | | - a[t] = a[t - p] |
1487 | | - db(t + 1, p) |
1488 | | - for j in range(a[t - p] + 1, k): |
1489 | | - a[t] = j |
1490 | | - db(t + 1, t) |
1491 | | - |
1492 | | - db(1, 1) |
1493 | | - return ''.join(sequence) |
1494 | | - |
1495 | | - def __init__(self, size=None, start=0, charset_type=None): |
1496 | | - # type: (Optional[int], int, Optional[int]) -> None |
1497 | | - self.size = size if size is not None else RandNumExpo(0.01) |
1498 | | - self.start = start |
1499 | | - self.charset_type = charset_type |
1500 | | - |
1501 | | - def _command_args(self): |
1502 | | - # type: () -> str |
1503 | | - ret = "" |
1504 | | - if isinstance(self.size, VolatileValue): |
1505 | | - if self.size.lambd != 0.01 or self.size.base != 0: |
1506 | | - ret += "size=%r" % self.size.command() |
1507 | | - else: |
1508 | | - ret += "size=%r" % self.size |
1509 | | - |
1510 | | - if self.start != 0: |
1511 | | - ret += ", start=%r" % self.start |
1512 | | - |
1513 | | - if self.charset_type: |
1514 | | - ret += ", charset_type=%r" % self.charset_type |
1515 | | - |
1516 | | - return ret |
1517 | | - |
1518 | | - def _fix(self): |
1519 | | - # type: () -> bytes |
1520 | | - if isinstance(self.size, VolatileValue): |
1521 | | - size = self.size._fix() |
1522 | | - else: |
1523 | | - size = self.size |
1524 | | - charset = self.cyclic_pattern_charset(self.charset_type or 0) |
1525 | | - pattern = self.de_bruijn(charset, 3, size + self.start) |
1526 | | - return pattern[self.start:size + self.start].encode('utf-8') |
0 commit comments