Owned!!!
错误!如果我将消息保留在
.text
中,则一切正常。用于执行:;hello3.asm attempts to make the code position independent
section .text
global _start
_start:
;clear out the registers we are going to need
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
;write(int fd, char *msg, unsigned int len)
mov al, 4
mov bl, 1
;Owned!!! = 4f,77,6e,65,64,21,21,21
;push !,!,!,d
push 0x21212164
;push e,n,w,O
push 0x656e774f
mov ecx, esp
mov dl, 8
int 0x80
;exit(int ret)
mov al,1
xor ebx, ebx
int 0x80
有什么想法吗?
#1 楼
段错误错误与将字符串压入堆栈无关。我使用gdb对其进行调试,问题出在: br />
更改
;exit(int ret)
mov al,1
xor ebx, ebx
int 0x80
到
mov al,1
修复分段错误。
在Kali Linux上进行了测试。
评论
是的,但是具有mov eax,1会在有效载荷中引入00的事实,这就是我们为什么使用mov al,1的原因。我想知道为什么它崩溃了,我也使用kali
– Dhayalan Pro
16年5月29日在15:50
如果您使用的是Kali,请让msfvenom负责。示例:msfvenom --platform linux -a x86 -f elf -b“ \ x00 \ xff” -o outputbin
– JeffreyZ
16年5月29日在16:04
我知道msfvenom,所以学习Exploit写作:D
– Dhayalan Pro
16年5月29日在16:14
另外,如果您要在没有msfvenom的情况下执行此操作,则可以将“ mov eax,1”替换为“ xor eax,eax inc eax”以避免00s
– JeffreyZ
16年5月29日在16:17
是的,我刚刚将代码更改为xor rax,rax mov al,0x3c但是00仍然会出现,因为我有一个mov di,2有什么想法吗?
– Dhayalan Pro
16年5月29日在16:20
#2 楼
除了@ user2389688的回答外,还需要注意的是,如果您正在执行amd64,则syscall编号是错误的,传递的寄存器也是如此。这是一个64位的abi版本,可以纠正差异并提供预期的输出。;hello3.asm attempts to make the code position independent
; rewrite of hello3.asm to use 64 bit syscall interface
section .text
global _start
_start:
xor rax, rax ; syscall
xor rdi, rdi ; arg1
xor rsi, rsi ; arg2
xor rdx, rdx ; arg3
; write(int fd, char *msg, unsigned int len)
mov al, 1
mov di, ax
;Owned!!! = 4f,77,6e,65,64,21,21,21
;push !,!,!,d
;push e,n,w,O
sub rsp, 8
mov dword [rsp], 'Owne'
mov dword [rsp + 4], 'd!!!'
mov rsi, rsp
mov dl, 8
syscall
; exit(int ret)
; syscall errors will result in rax having a negative value so you
; can't just move al
mov eax, 0xffffffc3
not eax
xor rdi, rdi
syscall
评论
是的,我们确实可以移动al,这就是它们为有效负载中没有00所做的工作
– Dhayalan Pro
16年5月29日在15:54
消除0可以通过多种方式完成。但是,如果先前的系统调用出错,那么eax的高位将不会为0。我已经在答案中更新了代码以消除0。
–百老汇
16年5月29日在19:34
其实这太有效了,0x3c
– Dhayalan Pro
16年5月29日在19:57
仅当写入未产生错误时。不过,您可以先对其进行异或运算以避免该问题。有很多避免0字节的方法。
–百老汇
16年5月29日在20:02
#3 楼
我在64位计算机上尝试了您的代码,但有一些注意事项:当您按字符串的2个代码片段时,堆栈中包含一个无效单词: >
Breakpoint 1, 0x000000000040009a in _start () [bp before int 0x80]
(gdb) x/4wx $rsp
0x7fffffffde30: 0x656e774f 0x00000000 0x21212164 0x00000000
这将导致
write
系统调用失败(因为我们指示长度为8)。因此,在系统调用之后,在寄存器%rax
中立即包含错误代码: :mov al,1
。将不会执行
%rax
系统调用,并且代码将继续存储的内容...结果不是确定性的...(在我的情况下,segfault发生在某处尝试在寄存器0xffffffffffffff01
包含exit
时访问*%rsi
。希望对任何人都有用。字符串,以这种方式可以确保字符串以
%rsi
值结尾。否则,如果内存中包含另一个值,则0
可能会打印一些奇怪的字符。
评论
@perror哇,您无法回答,但想通过更正问题-_-获得代表
我无法通过更正您的拼写而获得任何声誉。它只是伤害了我的眼睛,因此我将其修复。下次请多加注意,我们在这里提问时有一些标准(甚至是愚蠢的问题)。
@DhayalanPro不必这么苛刻,所有StackExchange网站都可以根据需要进行社区编辑,我看不出有什么问题。