كيفية استخدام العنونة النسبية لـ RIP في برنامج تجميع 64 بت؟
-
15-09-2020 - |
سؤال
كيف يمكنني استخدام 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