-2

I wrote assembly code to test the shellcode example. However, I got the following errors when I compile assembly code. I've tried to compile assembly code as .S and .s too. also, I tried to compile as "gcc -nostdlib -static shellcode.s -o shellcode-elf" and "as shellcode.s -o shellcode.o" too.

Can anyone please help me with compiling simple assembly code on by Ubuntu ?(Using mac M1 chip)

uname -a :

Linux ubuntu 5.8.0-49-generic #55~20.04.1-Ubuntu SMP Fri Mar 26 01:00:41 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

Errors:

shellcode.s: Assembler messages:
shellcode.s:6: Error: operand 1 must be an integer register -- `mov rax,59'
shellcode.s:7: Error: unknown mnemonic `lea' -- `lea rdi,[rip+binsh]'
shellcode.s:8: Error: operand 1 must be an integer register -- `mov rsi,0'
shellcode.s:9: Error: operand 1 must be an integer register -- `mov rdx,0'
shellcode.s:10: Error: unknown mnemonic `syscall' -- `syscall'

Assembly code:

global _start
_start:
xor %eax, %eax
xor %edx, %edx
push %eax
push $0x68732f2f
push $0x6e69622f
mov %esp, %ebx
push %edx
push %ebx
mov %esp, %ecx
movb $0x0B, %al
int $0x80
Frant
  • 5,382
  • 1
  • 16
  • 22
  • 3
    This is x86 assembly code. It will not assemble for or run onan aarch64 chip. – fuz Apr 20 '21 at 19:28
  • Thank you for the comments. Can you please let me know where should if fix it? I tried with different codes but the problem is... it can't compile.... – Seonghun Son Apr 20 '21 at 19:34
  • There is no way to fix this. Rewrite the code for aarch64. – fuz Apr 20 '21 at 20:11
  • Ah...Thank you! I just solved it. So there aren't other ways to run x86 assembly code on my aarch64 chip right? Sorry for the dumb question. – Seonghun Son Apr 20 '21 at 20:44
  • 2
    The only way is to use some sort of emulation. The chip cannot run x86 code and nothing in the world will change that. – fuz Apr 20 '21 at 21:39
  • 2
    This shellcode would only be useful if you were trying to exploit an x86 executable which was itself running under emulation. So you could for instance run the whole thing inside qemu. You'd then need to use a cross-assembler to build the x86 shellcode. – Nate Eldredge Apr 20 '21 at 21:40
  • So you guys are saying that use a cross-compiler to make that possible right? – Seonghun Son Apr 21 '21 at 00:10
  • @SeonghunSon With a cross-assembler, you can assemble the code, yes. However, it still won't run on your computer. – fuz Apr 21 '21 at 10:44

1 Answers1

1

As pointed-out in the comments, you can compile/execute programs targeting x86-64 Linux on a AArch64 Linux system using a cross-compiler and an emulator such as qemu-user.

Please note that the program will not be natively executed though. This should however be sufficient for your needs.

This example was built on a Aarch64 Ubuntu 20.04 system:

uname -a
Linux orangepipc2 5.10.21-sunxi64 #21.02.3 SMP Mon Mar 8 00:45:13 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

# install the cross-compiler and qemu-user
sudo apt-get install gcc-10-multilib-x86-64-linux-gnu
sudo apt-get install qemu-user

Create hello.s (credits: https://cs.lmu.edu/~ray/notes/gasexamples/), since the code you provided does not assemble properly. Pointing-out why is out of the scope of the current answer - you should be able to fix the code by yourself once you will have the x86-64 cross-compiler installed.

hello.s:
       .global main
       .text
main:
        # write(1, message, 13)
        mov     $1, %rax                # system call 1 is write
        mov     $1, %rdi                # file handle 1 is stdout
        mov     $message, %rsi          # address of string to output
        mov     $13, %rdx               # number of bytes
        syscall                         # invoke operating system to do the write

        # exit(0)
        mov     $60, %rax               # system call 60 is exit
        xor     %rdi, %rdi              # we want return code 0
        syscall                         # invoke operating system to exit
message:
        .ascii  "Hello, world\n"

/usr/bin/x86_64-linux-gnu-gcc-10 -static  -o hello hello.s
file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=2fb401aedb8c9593ea93c0c2dd59b91f11b57b10, for GNU/Linux 3.2.0, not stripped

qemu-x86_64  hello
Hello, world
Frant
  • 5,382
  • 1
  • 16
  • 22
  • God... It really helped. That you so much :) – Seonghun Son Apr 23 '21 at 02:40
  • Hi @Seonghun Son: Glad to read that. If this or any answer has solved your question please consider [accepting it](https://meta.stackexchange.com/q/5234/179419) by clicking the check-mark. This indicates to the wider community that you've found a solution and gives some reputation to both the answerer and yourself. There is of course no obligation to do this. – Frant Apr 23 '21 at 12:40