【问题标题】:Shellcode: call + nullShellcode:调用+空
【发布时间】:2013-07-16 05:14:07
【问题描述】:

我有以下用于 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(或者我可以吗?)来手动计算偏移量。

【问题讨论】:

    标签: null call shellcode


    【解决方案1】:

    您应该能够改用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 指令设置任何内容。但是,如果您需要这样的说明,您可以自己轻松地完成程序序言。

    【讨论】:

    • 其实你提醒我/给了我测试@dna的想法谢谢,我可以在shellcode中多次jmp/call/ret。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多