Skip to content

Add ability to specify more parameters to asm() function to specify target architecture #2539

Open
@OBarronCS

Description

@OBarronCS

The pwntools asm and make_elf_from_assembly functions are really amazing - they are great for really quickly testing out small snippets of assembly instructions. It would be great to be able to have more fine grained control with the arguments that are passed to the assembler and linker inside of the asm function.

This was spurred by testing a 32-bit RISC-V script that had an assembly instruction that required a RISC-V ISA extension that can be enabled via an assembler flag.

For example, the following RISC-V assembly snippet uses the bset instruction specified in the RISC-V zbs extension (I tested this with the apt gcc-14-riscv64-linux-gnu package installed):

#!/usr/bin/env python3

from pwn import *

context.arch = "riscv32"

RISCV=f"""
li a2, 4
bset a2,zero,a2
"""
out = make_elf_from_assembly(RISCV)

print(out)
print("-"*80)
gdb.debug(out)

pause()

These extensions are typically enabled by appending strings to the -march flag passed to the assembler. For example, to enable the zbs extension, you can change the following line:

'riscv32': [gas, '-march=rv32gc', '-mabi=ilp32'],

to

'riscv32': [gas, '-march=rv32gc_zbs', '-mabi=ilp32'],

(note the _zbs)

Perhaps there could be new named parameters such extensions that are passed to the assembler, and similarly another parameter to modify/(override?) the binary format.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions