كيفية استخدام العنونة النسبية لـ RIP في برنامج تجميع 64 بت؟

StackOverflow https://stackoverflow.com/questions/3250277

سؤال

كيف يمكنني استخدام RIP Relative Addressing في برنامج تجميع Linux لبنية AMD64؟أنا أبحث عن مثال بسيط (برنامج Hello World) يستخدم وضع العنونة النسبي AMD64 RIP.

على سبيل المثال، سيعمل برنامج التجميع 64 بت التالي مع العنونة العادية (العنونة المطلقة):

.text
    .global _start

_start:
    mov $0xd, %rdx

    mov $msg, %rsi
    pushq $0x1
    pop %rax
    mov %rax, %rdi
    syscall

    xor %rdi, %rdi
    pushq $0x3c
    pop %rax
    syscall

.data
msg:
    .ascii    "Hello world!\n"

أعتقد أن نفس البرنامج الذي يستخدم RIP Relative Addressing سيكون مثل:

.text
    .global _start

_start:
    mov $0xd, %rdx

    mov msg(%rip), %rsi
    pushq $0x1
    pop %rax
    mov %rax, %rdi
    syscall

    xor %rdi, %rdi
    pushq $0x3c
    pop %rax
    syscall

msg:
    .ascii    "Hello world!\n"

يعمل الإصدار العادي بشكل جيد عند تجميعه مع:

as -o hello.o hello.s && ld -s -o hello hello.o && ./hello

لكن لا يمكنني تشغيل إصدار RIP.

أيه أفكار؟

--- يحرر ----

إجابة ستيفن كانون تجعل إصدار RIP يعمل.

الآن عندما أقوم بتفكيك الملف القابل للتنفيذ لإصدار RIP أحصل على:

objdump -d مرحبا

0000000000400078 <.text>:
  400078: 48 c7 c2 0d 00 00 00  mov    $0xd,%rdx
  40007f: 48 8d 35 10 00 00 00  lea    0x10(%rip),%rsi        # 0x400096
  400086: 6a 01                 pushq  $0x1
  400088: 58                    pop    %rax
  400089: 48 89 c7              mov    %rax,%rdi
  40008c: 0f 05                 syscall 
  40008e: 48 31 ff              xor    %rdi,%rdi
  400091: 6a 3c                 pushq  $0x3c
  400093: 58                    pop    %rax
  400094: 0f 05                 syscall 
  400096: 48                    rex.W
  400097: 65                    gs
  400098: 6c                    insb   (%dx),%es:(%rdi)
  400099: 6c                    insb   (%dx),%es:(%rdi)
  40009a: 6f                    outsl  %ds:(%rsi),(%dx)
  40009b: 20 77 6f              and    %dh,0x6f(%rdi)
  40009e: 72 6c                 jb     0x40010c
  4000a0: 64 21 0a              and    %ecx,%fs:(%rdx)

مما يوضح ما كنت أحاول تحقيقه:lea 0x10(%rip),%rsi يقوم بتحميل العنوان بعد 17 بايت من تعليمات lea وهو العنوان 0x400096 حيث يمكن العثور على سلسلة Hello World وبالتالي يؤدي إلى كود مستقل للموضع.

هل كانت مفيدة؟

المحلول

أعتقد أنك تريد تحميل العنوان من السلسلة إلى godyodicetagcode؛يحاول الرمز الخاص بك تحميل كلمة سروية من هذا العنوان بدلا من العنوان نفسه.تريد:

giveacodicetagpre.

إذا لم أكن مخطئا.ليس لدي مربع Linux لاختبارها، ومع ذلك.

نصائح أخرى

وبما أنك بحاجة إلى عنوان من الرسائل في %rsi، فقط استبدل:

mov msg(%rip),%rsi

مع:

lea msg(%rip),%rsi
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top