Browse Source

check for nop before growth

master
JoYo 3 years ago
parent
commit
db785d80da
  1. 16
      sins/mutation.py
  2. 11
      sins/orm.py
  3. 17
      sins/run.py

16
sins/mutation.py

@ -4,6 +4,8 @@ from random import randint
import ctypes
import mmap
from .disassemble import disasm
seed_shell = b''.join([
b'\x55',
b'\x48\x89\xe5',
@ -53,14 +55,14 @@ def generation(queue: Queue, shellcode: bytes):
def growth(*, shellcode: bytes, length: int) -> bytes:
shellcode = bytearray(shellcode)
for mnemonic, op_str in disasm(shellcode):
if mnemonic == 'nop':
return bytes(shellcode)
# slow growth and stop shrinking
if length > len(shellcode):
growth = 1
else:
growth = 0
if length <= len(shellcode):
return bytes(shellcode)
shellcode = shellcode + (b'\x90' * growth)
shellcode = bytearray(shellcode)
shellcode += b'\x90'
return bytes(shellcode)

11
sins/orm.py

@ -43,7 +43,7 @@ class ScrapNode(Base):
self.image = child
self.length = len(child)
self.sha1sum
self.disasm = disasm(child)
self.disasm = str(disasm(child))
def __repr__(self):
values = {
@ -66,12 +66,3 @@ class ScrapNode(Base):
self.checksum = checksum.hexdigest()
return self.checksum
def disasm(shellcode: bytes) -> str:
opcodes = list()
for opcode in capstone.disasm(shellcode, 0):
opcodes += f'{opcode.mnemonic} {opcode.op_str}\n'
return opcodes

17
sins/run.py

@ -65,24 +65,21 @@ def sins():
seed_data = seed_file.read()
seed = ScrapNode(child=seed_data)
exists = session.query(ScrapNode).filter(
ScrapNode.checksum == seed.checksum)
if exists:
seed = exists[0]
else:
session.add(seed)
session.commit()
logger.debug(f'args.seed:\n{seed}')
elif recent:
seed = recent
logger.debug(f'recent:\n{seed}')
else:
seed = ScrapNode(child=seed_shell)
logger.debug(f'seed_shell:\n{seed}')
exists = session.query(ScrapNode).filter(ScrapNode.checksum == seed.checksum).all()
if exists:
seed = exists[0]
else:
session.add(seed)
session.commit()
logger.debug(f'seed_shell:\n{seed}')
parent = seed
queue = Queue()

Loading…
Cancel
Save