哪位高人能帮忙看以下这行汇编代码什么意思

内核编译和嵌入式产品的设计与开发
回复
yangxuserene
帖子: 5
注册时间: 2009-09-08 16:58

哪位高人能帮忙看以下这行汇编代码什么意思

#1

帖子 yangxuserene » 2010-10-21 11:04

//以下是全部代码,需要解释的那行用红色标出了
#define ORIG_ADDRESS $0x7e504610
.global shcode
.global shcode_end
shcode:
// first our arbitrary code; here it just increases the counter
jmp afterbuf
nop
nop
buf:
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
afterbuf:
call getip
getip:
pop %eax
incq (buf-getip)( %eax)
//jump back to SMM
mov ORIG_ADDRESS, %eax
jmp *(%eax)
shcode_end:

调试时候报的错误是 shcode.S:15: Error: suffix or operands invalid for `inc';
但是当我把incq改为inc时 又报了如下的错误:shcode.S:15: Error: no instruction mnemonic suffix given and no register operands; can't size instruction
谢谢大家了!
头像
Kandu
帖子: 108
注册时间: 2008-12-24 12:02
联系:

Re: 哪位高人能帮忙看以下这行汇编代码什么意思

#2

帖子 Kandu » 2010-10-30 17:55

binutils 沒編譯進 amd64 的支持,當然就不能用 incq 指令了。下源碼自己編譯個就好了。
头像
Kandu
帖子: 108
注册时间: 2008-12-24 12:02
联系:

Re: 哪位高人能帮忙看以下这行汇编代码什么意思

#3

帖子 Kandu » 2010-10-30 18:13

代碼太少,看不出作用,不過裡面有個典型的 PIC 技巧倒是很常見:

i386 和 amd64 架構的 cpu, ip 總是指向當前執行指令的下一個指令(並不是下一條將被執行的指令)

call getip 就把當前指令的下一條指令 getip 的地址壓入棧
然後 pop %eax, getip 的地址就存入 %eax 了
這樣的 call 下一條指令然後馬上 pop 的做法一般用在 PIC 的程序當中用於取得當前程序被定位的位置。
不過接下來的語句沒什麼意思了
incq buf-getip(%eax)
結果和 incq (buf) 沒區別呀。因為此時 %eax == getip。
yangxuserene
帖子: 5
注册时间: 2009-09-08 16:58

Re: 哪位高人能帮忙看以下这行汇编代码什么意思

#4

帖子 yangxuserene » 2010-11-04 14:39

Kandu 写了:代碼太少,看不出作用,不過裡面有個典型的 PIC 技巧倒是很常見:

i386 和 amd64 架構的 cpu, ip 總是指向當前執行指令的下一個指令(並不是下一條將被執行的指令)

call getip 就把當前指令的下一條指令 getip 的地址壓入棧
然後 pop %eax, getip 的地址就存入 %eax 了
這樣的 call 下一條指令然後馬上 pop 的做法一般用在 PIC 的程序當中用於取得當前程序被定位的位置。
不過接下來的語句沒什麼意思了
incq buf-getip(%eax)
結果和 incq (buf) 沒區別呀。因為此時 %eax == getip。
非常感谢您的回复!我先尝试着编一下binutils!另外 我给您发了封邮件 因为我不知道您什么时候还会在看这帖子
yangxuserene
帖子: 5
注册时间: 2009-09-08 16:58

Re: 哪位高人能帮忙看以下这行汇编代码什么意思

#5

帖子 yangxuserene » 2010-11-04 14:46

Kandu 写了:代碼太少,看不出作用,不過裡面有個典型的 PIC 技巧倒是很常見:

i386 和 amd64 架構的 cpu, ip 總是指向當前執行指令的下一個指令(並不是下一條將被執行的指令)

call getip 就把當前指令的下一條指令 getip 的地址壓入棧
然後 pop %eax, getip 的地址就存入 %eax 了
這樣的 call 下一條指令然後馬上 pop 的做法一般用在 PIC 的程序當中用於取得當前程序被定位的位置。
不過接下來的語句沒什麼意思了
incq buf-getip(%eax)
結果和 incq (buf) 沒區別呀。因為此時 %eax == getip。
这里附件中是所有的四部分源代码,是波兰Invisible Things Lab的Joanna写的Attacking SMM Memory via Intel® CPU Cache Poisoning的源代码,如果您感兴趣的话,可以看一下。
附件
o68-2.rar
(2.73 KiB) 已下载 54 次
头像
Kandu
帖子: 108
注册时间: 2008-12-24 12:02
联系:

Re: 哪位高人能帮忙看以下这行汇编代码什么意思

#6

帖子 Kandu » 2010-11-04 22:27

Kandu 写了: incq buf-getip(%eax)
結果和 incq (buf) 沒區別呀。因為此時 %eax == getip。
一個是通過 %eax 做基址然後加偏移。
一個是直接用偏移。

我看了那個源碼,源碼應該是不全的。因为在 README 中说這段指令是在 smm mode 下執行的。不过原始源碼这里用的是 64 位指令(當然,你這裡都改成32版指令了),这些指令在直接由 cpu 设置的 smm mode 下解析的话,是达不到需要的效果的,所以前面肯定还有一段 paging 并跳入 long mode 的代码。因为在那段遗失的代码中重新设置模式,做过 paging了,所以此時必須 incq buf-getip(%eax),而不能 incq (buf) 。因為此時屬於 PIC 的情況了。
而 buf-getip 這樣的,兩個不正確的數相減,得出的結果反而是正確的偏移了。再加上執行時才計算出的(call & pop)得出的基址。就能訪問到正確的地方了。

即使原先并未做过 paging 且未开 Long mode 且这里的代码直接是 16 mode 代码来执行,也不能直接用 inc (buf)。
普通保護模式下, cpu 進行虛擬地址->線性地址->物理地址的轉換。此時是 smm mode, cpu 把所有執行的指令中地址當作物理地址,所以原先由編譯器分配的 getip 呀,buf 呀這些地址都是不準確的了,因為 虛擬地址 != 物理地址。此時用 inc(buf)就會去操作一個不正確的地址。此時 %eax 也是不等于由編譯計算出的getip的值。
回复