【发布时间】:2018-05-25 11:41:26
【问题描述】:
尽管这两个程序都遵守 shellcode 执行所需的相对寻址指令,并且都在执行时打印所需的消息,但当用作 shellcode 时,第二个示例会失败。谁能解释这种行为?奇怪的是,与第一个相同的第三个样本也失败了。
输出: 示例 1 你好世界
Other Samples(2&3) 打印垃圾值
示例 1
全局_start 部分 .text _开始: jmp 加宽 酸碱度世界: 流行音乐 xor rax,rax 移动,1 mov rdi,rax mov rdx,rdi 添加 rdx,11 系统调用 ;出口 xor rax,rax mov rax,60 xor rdi,rdi 系统调用 扩大: 调用 pHworld Hworld db "Hello World",0xa示例 2
全局_start 部分 .text _开始: 调用 pHworld Hworld db "Hello World",0xa 酸碱度世界: 流行音乐 xor rax,rax 移动,1 mov rdi,rax mov rdx,rdi 添加 rdx,11 系统调用 ;出口 xor rax,rax mov rax,60 xor rdi,rdi 系统调用示例 3
全局_start 部分 .text _开始: 跳转标签1 标签1: 调用 pHworld Hworld db "Hello World",0xa 酸碱度世界: 流行音乐 xor rax,rax 移动,1 mov rdi,rax mov rdx,rdi 添加 rdx,11 系统调用 ;出口 xor rax,rax mov rax,60 xor rdi,rdi 系统调用无法满足我的好奇心,我尝试了另一种变体,尽管我的 objdump 没有任何 0x00,但它失败了(打印垃圾值)。 示例 4
全局_start 部分 .text 酸碱度世界: 流行音乐 xor rax,rax 移动,1 mov rdi,rax mov rdx,rdi 添加 rdx,11 系统调用 xor rax,rax xor rdi,rdi 移动,60 系统调用 l1: 调用 pHworld Hworld db“你好世界”,0xa _开始: 跳转 l1 在此处输入代码sample4 的 Objdump
./hworld2.s:文件格式elf64-x86-64 部分.text的反汇编: 0000000000400080 : 400080: 5e 流行 rsi 400081: 48 31 c0 xor rax,rax 400084:b0 01 移动,0x1 400086: 48 89 c7 mov rdi,rax 400089: 48 89 fa mov rdx,rdi 40008c: 48 83 c2 0b 添加 rdx,0xb 400090: 0f 05 系统调用 400092: 48 31 c0 xor rax,rax 400095: 48 31 ff xor rdi,rdi 400098: b0 3c 移动,0x3c 40009a: 0f 05 系统调用 000000000040009c: 40009c: e8 df ff ff ff 呼叫 400080 00000000004000a1: 4000a1: 48 雷克斯.W 4000a2:65 克 4000a3: 6c ins BYTE PTR es:[rdi],dx 4000a4: 6c ins BYTE PTR es:[rdi],dx 4000a5: 6f 输出 dx,DWORD PTR ds:[rsi] 4000a6: 20 57 6f 和字节 PTR [rdi+0x6f],dl 4000a9: 72 6c jb 400117 4000ab:64 飞秒 4000ac: 0a eb 或 ch,bl 00000000004000ad: 4000ad: eb ed jmp 40009c【问题讨论】:
-
第三个显然与第一个不同。它使用 jmp/call 但布局不同。
-
请注意,64 位代码不需要
call/pop将 PC 相对地址获取到寄存器中。您可以使用 RIP 相对 LEA。例如Avoiding 0xFF bytes in shellcode using CALL to read RIP?,或者只是jmp转发你的字符串并使用lea rdi, [rel msg]表示否定的rel32。它实际上并不比 call/pop 小,而是指令更少。
标签: linux assembly nasm x86-64 shellcode