簡體   English   中英

asm rip-relative尋址

[英]asm rip-relative addressing

我正在做一些CTF挑戰,我有一個程序,如果那里有一個syscall,sysenter或int 80指令,則檢查用戶輸入的緩沖區是否逐字節地傳遞。

我要做的是編寫一個shellcode,將syscall指令的第二個字節修改為有效的。 也就是說,輸入的最后兩個字節是\\x0f\\x01 ,我希望shellcode本身將其覆蓋為\\x0f\\x05 (系統調用)。

所以原始shellcode的最后幾條指令看起來像這樣:

  ....
  21:   31 c0                   xor    %eax,%eax
  23:   88 47 07                mov    %al,0x7(%rdi)
  26:   48 89 7f 08             mov    %rdi,0x8(%rdi)
  2a:   48 89 47 10             mov    %rax,0x10(%rdi)
  2e:   48 8d 77 08             lea    0x8(%rdi),%rsi
  32:   48 89 c2                mov    %rax,%rdx
  35:   b0 3b                   mov    $0x3b,%al
  37:   0f 05                   syscall

並使用兩個額外的指令來重寫系統調用:

  ...
  37:   b1 05                   mov    $0x5,%cl
  39:   88 0d 01 00 00 00       mov    %cl,0x1(%rip) 
  3f:   0f 05                   syscall

但是,我看到39用一些尾隨零編碼,而23例如相似但位置相對於rdi而不是rip,則不是。

所以我的問題是,這看起來不錯嗎? 如果是這樣的話,為什么rip會出現尾隨零。 是否有一些rip-relative尋址特定的東西,例如4個字節必須遵循?

是否有一些rip-relative尋址特定的東西,例如4個字節必須遵循?

是。 如果查看指令集參考,2.2.1.6 RIP相對尋址,您將看到唯一的選項是RIP + disp32意味着32位位移。 如果您需要避免零字節,則必須采用不同的方式。 可能的解決方法是執行以下操作:

lea -1(%rip), %rax # -1 is needed to avoid zero bytes
movb $5, XX(%rax)  # with appropriate value of `XX`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM