因此,我一直在关注汇编方面的一些教程,而讲师会编译以下代码:分割。因此,当我尝试执行该命令时,出现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


有什么想法吗?

评论

@perror哇,您无法回答,但想通过更正问题-_-
获得代表
我无法通过更正您的拼写而获得任何声誉。它只是伤害了我的眼睛,因此我将其修复。下次请多加注意,我们在这里提问时有一些标准(甚至是愚蠢的问题)。

@DhayalanPro不必这么苛刻,所有StackExchange网站都可以根据需要进行社区编辑,我看不出有什么问题。

#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可能会打印一些奇怪的字符。