的Shellcode:呼叫+空

问题描述:

我有以下片组件的用于x86_64的shellcode的:的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后面删除三个空值。打近,打电话等等都没有做到。任何人都可以提供建议吗?

对不起,我不是很清楚。我正在使用调用,以便它可以保存writetr的地址,以便我可以立即弹出到rsi中。我无法访问rip(或者我能吗?)来手动计算偏移量。

您应该能够通过使用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指令设置任何东西。但是,如果你需要这样的指导,你可以轻松地自己做程序序言。

+0

其实你提醒我/给了我测试@dna的感谢,我可以在shellcode中多次jmp/call/ret。 谢谢! – user2585837

+0

很高兴我能帮上忙。有创意!干杯 – dna