Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t找出一个严重的堆栈段故障_C_Buffer Overflow_Shellcode_Stack Smash - Fatal编程技术网

Can';t找出一个严重的堆栈段故障

Can';t找出一个严重的堆栈段故障,c,buffer-overflow,shellcode,stack-smash,C,Buffer Overflow,Shellcode,Stack Smash,最近,我正在用《shellcoder手册》这本书进行一些惊人的堆叠练习。 但是,当我尝试在Ubuntu11.04上测试某些代码时,总是会出现一个段错误。 情况如下: 首先,我编写exit_外壳代码.s(只是简单的exit(0)函数): 然后我做了一个怪事。c: char shellcode[] = "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80"; void f(void) { int *ret; ret = (int *)&a

最近,我正在用《shellcoder手册》这本书进行一些惊人的堆叠练习。
但是,当我尝试在Ubuntu11.04上测试某些代码时,总是会出现一个段错误。
情况如下:

首先,我编写exit_外壳代码.s(只是简单的exit(0)函数):

然后我做了一个怪事。c:

char shellcode[] = "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80";
void f(void)
{
    int *ret;
    ret = (int *)&ret + 2;
    (* ret) = (int)shellcode;
}

void main (void)
{
    f();
}
编译:gcc-mprefered stack boundary=2-ggdb-fno stack protector-o wack-wack.c

但我运行它时收到了段错误

以下是gdb结果:

(gdb) disas main
Dump of assembler code for function main:
    0x080483af <+0>:    push   %ebp
    0x080483b0 <+1>:    mov    %esp,%ebp
    0x080483b2 <+3>:    call   0x8048394 <f>
    0x080483b7 <+8>:    pop    %ebp
    0x080483b8 <+9>:    ret
End of assembler dump.

(gdb) disas f
Dump of assembler code for function f:
    0x08048394 <+0>:    push   %ebp
    0x08048395 <+1>:    mov    %esp,%ebp
    0x08048397 <+3>:    sub    $0x4,%esp
    0x0804839a <+6>:    lea    -0x4(%ebp),%eax
    0x0804839d <+9>:    add    $0x8,%eax
    0x080483a0 <+12>:   mov    %eax,-0x4(%ebp)
    0x080483a3 <+15>:   mov    -0x4(%ebp),%eax
    0x080483a6 <+18>:   mov    $0x804a010,%edx
    0x080483ab <+23>:   mov    %edx,(%eax)
    0x080483ad <+25>:   leave
    0x080483ae <+26>:   ret
End of assembler dump.
在一些si之后,ret=0x0804a010,这是外壳代码数组的地址

(gdb) x/20x $ebp
0xbffff2c0: 0xbffff2c8  0x0804a010  0xbffff348  0x00145e37
0xbffff2d0: 0x00000001  0xbffff374  0xbffff37c  0x0012e414
0xbffff2e0: 0xffffffff  0x0012cff4  0x08048215  0x00000001
0xbffff2f0: 0xbffff330  0x0011da51  0x0012dad0  0xb7fffb48
0xbffff300: 0x00000001  0x0028cff4  0x00000000  0x00000000
一些si之后的段故障,我不理解

Program received signal SIGSEGV, Segmentation fault.
0x080483ae in f () at wack.c:8

你能帮帮我吗?

你做的每件事都是对的;您的问题是
shellcode
被放置在
中。data
ELF部分,而在现代系统中
中。data
被分配并放置在非可执行页面中。尝试以下操作以清除NX标志:

vmuser@ubuntu:~$ sudo apt-get update
vmuser@ubuntu:~$ sudo apt-get install execstack
vmuser@ubuntu:~$ execstack -s ./wack
vmuser@ubuntu:~$ ./wack
vmuser@ubuntu:~$ echo $?
execstack
是查询和修改ELF二进制文件的可执行堆栈标志的工具)


为了进一步了解现代OSs中的各种保护机制,我建议您开始阅读Mariano Graziano和Andrea Cuglari的论文,“

您做的一切都是正确的;您的问题是
shellcode
被放置在
中。data
ELF部分,而在现代系统中
中。data
被分配并放置在非可执行页面中。尝试以下操作以清除NX标志:

vmuser@ubuntu:~$ sudo apt-get update
vmuser@ubuntu:~$ sudo apt-get install execstack
vmuser@ubuntu:~$ execstack -s ./wack
vmuser@ubuntu:~$ ./wack
vmuser@ubuntu:~$ echo $?
execstack
是查询和修改ELF二进制文件的可执行堆栈标志的工具)


为了进一步了解现代OSs中的各种保护机制,我建议您开始阅读Mariano Graziano和Andrea Cuglari的论文“

试图重现您的问题-外壳代码看起来不错,我使用gcc 4.4.5(Debian 4.4.5-8)在Debian 6.0.3上编译了您使用的选项,就我而言,一切都很完美。你试过在另一台机器上编译和运行它吗?我怀疑它有这么简单,但是如果你使用
int*ret=malloc(sizeof(int))
(或者你需要的任何大小),会发生什么呢?不,我只使用Ubuntu 11.04@Rob@twain249:这不是OP的意图。他想用
外壳代码
@MichaelFoukarakis的地址覆盖堆栈是的,我也这么想。我试图重现你的问题-外壳代码看起来不错,我在Debian 6.0.3上使用gcc 4.4.5(Debian 4.4.5-8)编译,使用的选项与你使用的完全相同,在我的情况下,一切都很完美。你试过在另一台机器上编译和运行它吗?我怀疑它有这么简单,但是如果你使用
int*ret=malloc(sizeof(int))
(或者你需要的任何大小),会发生什么呢?不,我只使用Ubuntu 11.04@Rob@twain249:这不是OP的意图。他想用地址
shellcode
@MichaelFoukarakis覆盖堆栈是的,我也这么认为。
(gdb) x/20x $ebp
0xbffff2c0: 0xbffff2c8  0x0804a010  0xbffff348  0x00145e37
0xbffff2d0: 0x00000001  0xbffff374  0xbffff37c  0x0012e414
0xbffff2e0: 0xffffffff  0x0012cff4  0x08048215  0x00000001
0xbffff2f0: 0xbffff330  0x0011da51  0x0012dad0  0xb7fffb48
0xbffff300: 0x00000001  0x0028cff4  0x00000000  0x00000000
Program received signal SIGSEGV, Segmentation fault.
0x080483ae in f () at wack.c:8
vmuser@ubuntu:~$ sudo apt-get update
vmuser@ubuntu:~$ sudo apt-get install execstack
vmuser@ubuntu:~$ execstack -s ./wack
vmuser@ubuntu:~$ ./wack
vmuser@ubuntu:~$ echo $?