标签: fortify-source

缓冲区溢出在gdb中工作但不是没有它

我在CentOS 6.4 32位上,并试图在程序中导致缓冲区溢出.在GDB中它可以工作.这是输出:

[root@localhost bufferoverflow]# gdb stack
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/bufferoverflow/stack...done.
(gdb) r …
Run Code Online (Sandbox Code Playgroud)

c security buffer-overflow memory-safety fortify-source

39
推荐指数
4
解决办法
3万
查看次数

我怎样才能调用缓冲区溢出?

我有一个家庭作业,要求我使用缓冲区溢出调用函数而不显式调用它.代码基本上是这样的:

#include <stdio.h>
#include <stdlib.h>

void g()
{
    printf("now inside g()!\n");
}


void f()
{   
    printf("now inside f()!\n");
    // can only modify this section
    // cant call g(), maybe use g (pointer to function)
}

int main (int argc, char *argv[])
{
    f();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然我不知道该怎么办.我想改变程序计数器的返回地址,以便它直接进入g()的地址,但我不知道如何访问它.无论如何,提示将是伟大的.

c pointers buffer-overflow stack-trace fortify-source

31
推荐指数
3
解决办法
8843
查看次数

什么是缓冲区溢出?如何导致缓冲区溢出?

我听说过缓冲区溢出,我想知道如何导致缓冲区溢出.

有人能告诉我一个小缓冲区溢出的例子吗?新的(它们用于什么?)

c++ buffer-overflow fortify-source

30
推荐指数
5
解决办法
3万
查看次数

我可以欺骗libc(GLIBC_2.13)加载它没有的符号(来自GLIBC_2.15)吗?

在我尝试将"Steam for Linux"用于Debian时,我遇到了一个问题.libcef(Chromium Embedded Framework)可以正常使用GLIBC_2.13(Debian测试中的eglibc可以提供),但需要一个讨厌的额外函数GLIBC_2.15(eglibc无法提供):

$ readelf -s libcef.so | grep -E "@GLIBC_2\.1[4567]"
1037: 00000000     0 FUNC    GLOBAL DEFAULT  UND __fdelt_chk@GLIBC_2.15 (49)
2733: 00000000     0 FUNC    GLOBAL DEFAULT  UND __fdelt_chk@@GLIBC_2.15
Run Code Online (Sandbox Code Playgroud)

我的攻击计划是LD_PRELOAD一个提供这些功能的垫片库.这似乎不起作用.我真的想避免安装GLIBC_2.17(因为它是在Debian实验中;甚至Debian sid仍然有GLIBC_2.13).


这就是我尝试过的.

fdelt_chk.c基本上是从GNU C库中来的:

#include <sys/select.h>

# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
# define _strong_alias(name, aliasname) \
  extern __typeof (name) aliasname __attribute__ ((alias (#name)));

unsigned long int
__fdelt_chk (unsigned long int d) …
Run Code Online (Sandbox Code Playgroud)

glibc dynamic-linking ld fortify-source

17
推荐指数
2
解决办法
8454
查看次数

sprintf函数的缓冲区溢出?

{     
    char buf[8];
    sprintf(buf,"AAAA%3s","XXXXXXXX");
    printf("%s\n",buf);
}
Run Code Online (Sandbox Code Playgroud)

会发生什么?

缓冲区有8个字符空间,只剩下3个空闲字符,但"XXXXXXXX"长度为8个字符.

我在Windows 7上使用Visual Studion 2008进行测试.结果,程序打印出来:AAAXXXXXXX,发生了运行时错误.

c printf overflow fortify-source

11
推荐指数
4
解决办法
3万
查看次数

使用fgets导致缓冲区溢出

我正在尝试缓冲区溢出,并尝试使用一定的fgets输入覆盖堆栈的返回地址

这是代码:

void foo()
{
    fprintf(stderr, "You did it.\n");
}

void bar()
{
    char buf[20];
    puts("Input:");
    fgets(buf, 24, stdin);
    printf("Your input:.\n", strlen(buf));
}


int main(int argc, char **argv)
{
    bar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在正常执行时,程序只返回您的输入.我希望它输出foo()而不修改代码.

我的想法是buf通过进入20 'A'秒来溢出缓冲区.这会起作用并导致分段错误.我的下一个想法是找出其中的地址并将foo()\x4006cd附加到20 'A'秒.

根据我的理解,这应该覆盖堆栈的返回地址并使其跳转到foo.但它只会导致段错误.

我究竟做错了什么?

更新:汇编程序转储主要

    Dump of assembler code for function main:
   0x000000000040073b <+0>: push   %rbp
   0x000000000040073c <+1>: mov    %rsp,%rbp
   0x000000000040073f <+4>: sub    $0x10,%rsp
   0x0000000000400743 <+8>: mov    %edi,-0x4(%rbp)
   0x0000000000400746 <+11>:    mov    %rsi,-0x10(%rbp)
   0x000000000040074a <+15>:    mov …
Run Code Online (Sandbox Code Playgroud)

c stack-overflow buffer overflow fortify-source

11
推荐指数
1
解决办法
1万
查看次数

调用“__wmemcpy_chk_warn”:“调用 wmemcpy 的长度大于目标缓冲区的大小”

我有这段代码(让我们命名它problem.cpp):

\n
#include <string>\n\nusing str = std::wstring;\nstatic str foo(str text = str())\n{\n    text.resize(4);\n    return text;\n}\n\nint main()\n{\n    str a = foo();\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

-O1使用C++20 一致性 ( )调用 GCC(版本 12.2.1)g++ problem.cpp -Werror -O1 -std=c++20会导致此错误:

\n
In file included from /usr/include/features.h:490,\n                 from /usr/lib/gcc/x86_64-pc-linux-gnu/12/include/g++-v12/x86_64-pc-linux-gnu/bits/os_defines.h:39,\n                 from /usr/lib/gcc/x86_64-pc-linux-gnu/12/include/g++-v12/x86_64-pc-linux-gnu/bits/c++config.h:655,\n                 from /usr/lib/gcc/x86_64-pc-linux-gnu/12/include/g++-v12/string:38,\n                 from problem.cpp:1:\nIn function \xe2\x80\x98wchar_t* wmemcpy(wchar_t*, const wchar_t*, size_t)\xe2\x80\x99,\n    inlined from \xe2\x80\x98static constexpr std::char_traits<wchar_t>::char_type* std::char_traits<wchar_t>::copy(char_type*, const char_type*, std::size_t)\xe2\x80\x99 at /usr/lib/gcc/x86_64-pc-linux-gnu/12/include/g++-v12/bits/char_traits.h:558:16,\n    inlined from \xe2\x80\x98constexpr std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = …
Run Code Online (Sandbox Code Playgroud)

c++ gcc glibc fortify-source c++20

10
推荐指数
1
解决办法
193
查看次数

在雪豹中创建缓冲区溢出

作为大学计算机安全课程的一部分,我很快就要学习缓冲区溢出以及如何将它们用作漏洞.我正在尝试使用以下代码执行一些简单的缓冲区溢出:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char buffer_one[4], buffer_two[16];

    strcpy(buffer_one, "one");
    strcpy(buffer_two, "two");

    strcpy(buffer_one, argv[1]);

    printf("buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
    printf("buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
}
Run Code Online (Sandbox Code Playgroud)

如果我运行,我可以使用null终止符覆盖buffer_one的内容

$./overflow 1234567890123456
 buffer_two is at 0x7fff5fbff8d0 and contains '1234567890123456'
 buffer_one is at 0x7fff5fbff8e0 and contains ''
Run Code Online (Sandbox Code Playgroud)

但是如果我发送超过16个字符作为参数,程序将发送Abort陷阱.我认为这是Snow Leopard上的某种缓冲保护(可能是ASLR?).如果if的大小为buffer_two <16,那么adresse仍然是16位

我正在运行gcc -o overflow overflow.c -fno-stack-protector以删除堆栈保护

除了安装运行linux dist的VM之外,有没有解决这个问题的方法?

c security buffer-overflow osx-snow-leopard fortify-source

9
推荐指数
1
解决办法
1084
查看次数

Mac OS X Lion上的OpenMP编译失败(memcpy和SSE内在函数)

我偶然发现了以下问题.下面的代码片段在Mac OS X上没有与我试过的任何Xcode链接(4.4,4.5)

#include <stdlib.h>
#include <string.h>
#include <emmintrin.h>

int main(int argc, char *argv[])
{
  char *temp;
#pragma omp parallel
  {
    __m128d v_a, v_ar;
    memcpy(temp, argv[0], 10);
    v_ar = _mm_shuffle_pd(v_a, v_a, _MM_SHUFFLE2 (0,1));
  }
}
Run Code Online (Sandbox Code Playgroud)

代码仅作为示例提供,并且在运行时会出现段错误.关键是它不能编译.编译使用以下行完成

/Applications/Xcode.app/Contents/Developer/usr/bin/gcc test.c -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk -mmacosx-version-min=10.7 -fopenmp

 Undefined symbols for architecture x86_64:
"___builtin_ia32_shufpd", referenced from:
    _main.omp_fn.0 in ccJM7RAw.o
"___builtin_object_size", referenced from:
    _main.omp_fn.0 in ccJM7RAw.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

使用-fopenmp标志时,代码编译得很好gcc.现在,我用Google搜索了一圈,发现,与相连的第一个问题的解决方案 …

c c++ macos openmp fortify-source

8
推荐指数
1
解决办法
4622
查看次数

GCC如何检测堆栈缓冲区溢出

由于-fstack-protector-stronggcc中有一个选项可以检测堆栈粉碎.但是,它无法始终检测到堆栈缓冲区溢出.对于第一个函数func,当我输入10个字符串更多字符串时,程序并不总是崩溃.我的问题是有一种方法来检测堆栈缓冲区溢出.

void func()
{
    char array[10];
    gets(array);
}

void func2()
{
    char buffer[10];
    int n = sprintf(buffer, "%s", "abcdefghpapeas");
    printf("aaaa [%d], [%s]\n", n, buffer);
}

int main ()
{
   func();
   func2();
}
Run Code Online (Sandbox Code Playgroud)

c gcc buffer-overflow fortify-source

8
推荐指数
1
解决办法
1万
查看次数