我正在尝试编写一个文件,启动时运行命令:/bin/bash -c“echo hello; ls -la”
section .text
global _start
_start:
BITS 64
jmp short two
one:
pop rbx
mov [rbx+34], rbx
xor al, al
mov [rbx+9], al
mov [rbx+12], al
mov [rbx+33], al
xor rdx, rdx
mov [rbx+66], rdx
mov rcx, rbx
add rcx, 10
mov [rbx+42], rcx
add rcx, 3
mov [rbx+50], rcx
add rcx, 53
mov [rbx+58], rcx
mov rdi, rbx
lea rsi, [rbx+34]
mov rax, 59
syscall
two:
call one
db '/bin/bash', 0xFF
db '-c', 0xFF
db '"echo hello; ls -la"', 0xFF
db 'AAAAAAAA'
db 'BBBBBBBB'
db 'CCCCCCCC'
db 'DDDDDDDD'
db 'FFFFFFFF'
我是新手,据我了解,我所需要的只是一堆在内存中彼此相邻的指针。因此,我将指向实际参数的指针保存在占位符内存空间 AAAAAAA 到 DDDDDDDD 中。然后,我在系统调用之前将第一个引用地址移至 rsi。这是我在程序结束时得到的内存,其中 rsi 指向 0x4000e9:
0x4000c7: 0x2f 0x62 0x69 0x6e 0x2f 0x62 0x61 0x73
0x4000cf: 0x68 0x00 0x2d 0x63 0x00 0x22 0x65 0x63
0x4000d7: 0x68 0x6f 0x20 0x68 0x65 0x6c 0x6c 0x6f
0x4000df: 0x3b 0x20 0x6c 0x73 0x20 0x2d 0x6c 0x61
0x4000e7: 0x22 0x00 0xc7 0x00 0x40 0x00 0x00 0x00
0x4000ef: 0x00 0x00 0xd1 0x00 0x40 0x00 0x00 0x00
0x4000f7: 0x00 0x00 0xd4 0x00 0x40 0x00 0x00 0x00
0x4000ff: 0x00 0x00 0x09 0x01 0x40 0x00 0x00 0x00
0x400107: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
我一定错过了一些明显的东西,我想我不太明白数组在汇编中是如何工作的,但我不知道如何正确地做到这一点。
这里还有 gdb 猜测的参数:
Guessed arguments:
arg[0]: 0x4000c7 ("/bin/bash")
arg[1]: 0x4000e9 --> 0x4000c7 ("/bin/bash")
arg[2]: 0x0
arg[3]: 0x400109 --> 0x0
目前我在运行程序时遇到的错误是:
: echo hello; ls -la: command not found
Jester在评论中解决了这个问题: 数组没问题,错误是由于额外的引号造成的。删除这些并使用 db 'echo hello; ls -la',0xFF。您还需要调整偏移量。或者用空格替换引号,这样就不用了:)