Section .text
global _start
_start:
jmp short GoToCall
shellcode:
pop esi
xor eax, eax
mov byte [esi+7], al
lea ebx, [esi]
mov long [esi + 8], ebx
mov long [esi + 12], eax
mov byte al, 0x0b
mov ebx, [esi]
lea ecx, [esi + 8]
lea edx, [esi + 12]
int 0x80
GoToCall:
Call shellcode
db "/bin/shJAAAABBBB"
编译完上面的shellcode后,我得到了下面的反汇编。在第三行,我遇到了Segmentaion故障。
(gdb) disassemble shellcode
Dump of assembler code for function shellcode:
0x08049002 <+0>: pop %esi
0x08049003 <+1>: xor %eax,%eax
=> 0x08049005 <+3>: mov %al,0x7(%esi)
0x08049008 <+6>: lea (%esi),%ebx
0x0804900a <+8>: mov %ebx,0x8(%esi)
0x0804900d <+11>: mov %eax,0xc(%esi)
0x08049010 <+14>: mov q4312078qxb,%al
0x08049012 <+16>: mov (%esi),%ebx
0x08049014 <+18>: lea 0x8(%esi),%ecx
0x08049017 <+21>: lea 0xc(%esi),%edx
0x0804901a <+24>: int q4312078qx80
End of assembler dump.
(gdb) printf "%s", $esi
/bin/shJAAAABBBB(gdb) printf "%s", $esi+7
JAAAABBBB(gdb) si
Program received signal SIGSEGV, Segmentation fault.
0x08049005 in shellcode ()
(gdb)
#1 楼
导致SIGSEGV的指令尝试在''h'
'
中的"/bin/shJAAAABBBB"
之后存储.text
。您的所有代码/数据都在
objdump -h
部分中,该部分可能是只读的。运行q4312079q生成的二进制文件,您应该在输出中看到类似以下内容的内容:
5 .text 00000031 00001000 00001000 00001000 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
,其中包含存储字符串字节的地址。
#2 楼
您的shellcode所在并执行的内存不可写。它可能由于不同的原因而发生,我想您的shellcode被编码为C文字字符串。由于此内存位置不可写,因此会出现异常。
如果您只想尝试shellcode,请使用带有标志
mmap(2)
的PROT_EXEC | PROT_READ | PROT_WRITE
分配一个内存页,在其中复制shellcode并跳转到它。 顺便说一句,您的shellcode是无空字节的,如果使用
strcpy(3)
函数进行复制,则可以删除xor eax, eax
和mov [esi+7], al
,因为strcpy(3)
会为您写入0x00。只需确保将“ / bin / shJAAAABBBB”修剪为“ / bin / sh”即可。#3 楼
因为/bin/sh
需要"AAAABBBB"
,所以用q4312079q
替换q4312079q #4 楼
正如@booto的答案所示,objdump -h
打印出的.text
部分是只读的。您可以尝试像这样编译,而不必更新原始源代码:
nasm -f elf32 -o ./Execve.o Execve.nasm
ld -N -o ./Execve ./Execve.o
ld -N
:将文本和数据节设置为可读可写。
评论
实际上,对于ELF可执行文件,内存保护是根据段而不是该段设置的。但是无论如何,你是对的。
– wisk
19年3月13日在22:39
如果要写入“ / bin / shJAAAABBBB”并执行shellcode,我必须在汇编中进行哪些更新?
– Mukesh
19年3月15日在1:07