Search code examples
pythonlistelfpwntools

Remove bytes from list of bytestrings


I have this simple code:

from pwn import *


e = ELF(r'/home/user/Documents/pwnexercise')
print("Found hex:\n" + hex(e.symbols.main))

read_only_data = e.section('.rodata').split(b'\x00')
print(read_only_data)


for i in read_only_data: 
    print(i.decode())

Which gives me this output:

[*] '/home/user/Documents/pwnexercise'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)
Found hex:
0x4013fb
[b'\x01', b'\x02', b'', b'', b'', b'', b'Not correct secret sign, please try again, goodbye', b'', b'', b'', b'', b'', b'Rumors say that a hacker can complete 1024 math problems (addition or multiplication) in 60s.', b'%d ', b'%c ', b'%d = ?', b'%d', b'congrats!You completed the task!', b'Wrong, try next time', b'Please enter the secret sign', b'infA', b'']






Not correct secret sign, please try again, goodbye





Rumors say that a hacker can complete 1024 math problems (addition or multiplication) in 60s.
%d 
%c 
%d = ?
%d
congrats!You completed the task!
Wrong, try next time
Please enter the secret sign
infA

As you can see, the list,

[b'\x01', b'\x02', b'', b'', b'', b'', b'Not correct secret sign, please try again, goodbye', b'', b'', b'', b'', b'', b'Rumors say that a hacker can complete 1024 math problems (addition or multiplication) in 60s.', b'%d ', b'%c ', b'%d = ?', b'%d', b'congrats!You completed the task!', b'Wrong, try next time', b'Please enter the secret sign', b'infA', b'']

has alot of elemtents like b'' or b'\x01 etc.

I have tried to use remove("b'\") or remove("b''"), and other variants to remove the elements that doesn't contain actual strings, but I keep getting an error saying ValueError: list.remove(x): x not in list. So my question is, how do I transform the list into something like this:

[b'Not correct secret sign, please try again, goodbye', b'Rumors say that a hacker can complete 1024 math problems (addition or multiplication) in 60s.', b'%d ', b'%c ', b'%d = ?', b'%d', b'congrats!You completed the task!', b'Wrong, try next time', b'Please enter the secret sign', b'infA']

i.e. how do I remove the empty bytestrings from this list?


Solution

  • To remove these unwanted values from the list you can simply do:

    arr = [b'\x01', b'\x02', b'', b'My Value That i Want!']
    
    # Manually remove all unwanted values from the list
    arr.remove(b'\x01')
    arr.remove(b'\x02')
    arr.remove(b'')
    
    print(arr)
    # Out:
    # [b'My Value That i Want!']
    

    Or you can also do:

    from typing import Iterable
    
    def isalphastr(value: Iterable[int]):
        # Check if the value dont have nothing to iterate
        if not value:
            return False
    
        # Iterate between all caracters in bytes
        for c in value:
            # Check if in the ASCII table they are alpha caracters
            if 126 > c < 32:
                return False
        return True
    
    a = [b'\x01', b'\x02', b'', b'My Value That i Want!']
    
    # Filter my array of bytes
    it = filter(lambda x: isalphastr(x), a)
    
    # Convert the iterator to a list
    new_filted_array = list(it)
    
    print(new_filted_array)
    # Out:
    # [b'My Value That i Want!']
    

    In your case you could slice the list and get a chunk of the list, e.g.

    a = [b'\x01', b'\x02', b'', b'My Value That i Want!', b'Another value that i want']
    
    # Slice my list to get the last 2 values
    new_a = a[3:]
    
    print(new_a)
    # Out: 
    # [b'My Value That i Want!', b'Another value that i want']