我有一個關于將資料(地址表或其他資料)放在.text其功能下的部分或放入.data部分的問題?例如,我有一個這樣的功能:
extern int i0();
extern int i1();
extern int i2();
extern int i3();
extern int i4();
extern int i5();
void fff(int x) {
switch (x) {
case 0:
i0();
break;
case 1:
i1();
break;
case 2:
i2();
break;
case 3:
i3();
break;
case 4:
i4();
break;
case 5:
i5();
break;
}
}
在匯編中,這是我的代碼:
fff:
cmp edi, 5
ja .L10
mov edi, edi
xor eax, eax
jmp [QWORD PTR .L4[0 rdi*8]]
.L4:
.quad .L9
.quad .L8
.quad .L7
.quad .L6
.quad .L5
.quad .L3
.L5:
jmp i4
.L3:
jmp i5
.L9:
jmp i0
.L8:
jmp i1
.L7:
jmp i2
.L6:
jmp i3
.L10:
ret
這里我有.L4哪些保存跳轉地址......我應該把這張.L4表放在哪里?在fff功能下還是我必須把它放在.data部分?靜態資料呢?例如,我有 2QWORD個函式,我必須把它放在那個函式中,或者我必須把它們QWORDs放在資料部分?為什么 ?我知道把它放在.data段或者它的功能下是沒有問題的,但是我想知道哪種方式更好?
uj5u.com熱心網友回復:
該.data部分通常是可寫的,您不希望您的跳轉表被意外或惡意覆寫。所以.data不是最好的地方。
.text會好的;它通常是只讀的。它是否靠近函式并不重要。許多系統都有一個.rodata只讀且不可執行的部分,這會更好;這將有助于捕獲意外或故意嘗試執行跳轉表位元組的錯誤或攻擊。
uj5u.com熱心網友回復:
是的,您可以將指標表 ( .L4:) 放在.text部分中(如果它不會在運行時修改),但我沒有看到雙重間接指向一組外部函式跳轉的原因i0.. i5。您可以使用間接近跳轉進行分支,它從指向這些外部函式的指標表中獲取目標地址。聯結器負責完成外部地址。NASM/Intel 語法示例:
| | global fff
| | extern i0,i1,i2,i3,i4,i5
|00000000:4883FF05 |fff: cmp rdi, 5
|00000004:773A | ja .L10
|00000006:FF24FD[10000000] | jmp [.L4 8*rdi]
|0000000D:0F1F00 | align 8 ; For better performance.
|00000010:[0000000000000000] |.L4: dq i0
|00000018:[0000000000000000] | dq i1
|00000020:[0000000000000000] | dq i2
|00000028:[0000000000000000] | dq i3
|00000030:[0000000000000000] | dq i4
|00000038:[0000000000000000] | dq i5
|00000040:C3 |.L10:ret
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343797.html
上一篇:LDRRd,-LabelvsLDRRd,[PC Offset]
下一篇:NASM中的細分市場?
