我有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后面删除三个空值。呼叫附近,呼叫远等不是这样做的。任何人都可以提出建议吗?
抱歉,我不是很清楚。我正在使用调用,以便它保存了我可以立即弹出到rsi中的writestr的地址。我无法访问rip(或者我可以?)手动找出偏移量。
答案 0 :(得分: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
指令设置任何内容。但是如果你需要这样的指导,你可以轻松地自己做程序。