3

我有以下用于 x86_64 shellcode 的程序集:

call writer

writestring db "ABCD",0x0d0a

writer:
pop rsi

编译后, objdump -d 显示(为简洁起见,剪掉了一些):

  4000a4:   e8 06 00 00 00          callq  4000af <writer>

00000000004000a9 <writestr>:
  4000a9:   42                      rex.X
  4000aa:   42                      rex.X
  4000ab:   42                      rex.X
  4000ac:   42 0a 0d 5e 48 31 d2    rex.X

00000000004000af <writer>:
  4000af:   5e                      pop    %rsi

我想从 callq 后面删除三个空值。呼叫近,呼叫远等没有这样做。任何人都可以提供建议吗?

抱歉,我不是很清楚。我正在使用 call 以便它保存我可以在之后立即弹出到 rsi 的 writestr 的地址。我无法访问 rip(或者我可以吗?)手动计算偏移量。

4

1 回答 1

0

您应该能够通过使用JMP(或类似的)指令来消除空字节。例如:

jmp $+8  

writestring db "BBBB",0x0d, 0x0a

writer:
pop rsi

使用 生成以下机器代码nasm -f elf64

0000000000000000 <writestring-0x2>:
   0:   eb 06                   jmp    8 <writer>

0000000000000002 <writestring>:
   2:   42                      rex.X
   3:   42                      rex.X
   4:   42                      rex.X
   5:   42                      rex.X
   6:   0d                      .byte 0xd
   7:   0a                      .byte 0xa

0000000000000008 <writer>:
   8:   5e                      pop    %rsi

您可能注意到我没有为RET指令设置任何内容。但是,如果您需要这样的说明,您可以自己轻松地完成程序序言。

于 2013-07-17T12:58:59.637 回答