标签: buffer-overflow

gdb 输入文件中的十六进制值

我正在尝试通过使用 gdb 内的 run < inputfile 重定向输入(以获取)来对 DVL 进行特定的利用

我可以成功地溢出程序,但在将十六进制值附加到字符串时遇到问题。我尝试过引用、将 mem addr 的值转换为 ascii 以及各种转义尝试(\、\、\),但没有成功

输入文件示例:AAAA\x42

在上面的示例中,反斜杠似乎被读取为 ascii 字符 (5c),并且值 42 保留在堆栈中(奇怪?)。

如何在 gdb 输入文件中指定十六进制值?

谢谢

hex gdb buffer-overflow

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

为什么我的 C 代码会抛出分段错误,即使返回指针指向看似有效的 shellcode 的内存地址?

我正在尝试遵循有关缓冲区溢出的教程(Vivek Ramachandran 的缓冲区溢出入门)。我实际上是在遵循他的代码,该代码在演示中对他有效,并且到目前为止对我也有效。

下面的 C 程序的目标是将退出系统调用的 shellcode 分配给一个变量,然后用 shellcode 变量的内存地址替换 main 函数的默认返回地址(指向 __lib_start_main),这样程序在完成主函数后执行 shellcode,然后优雅地退出程序,退出值为 20(如执行“exit(20)”)。不幸的是,程序以分段错误结束。我在 32 位 Linux Mint 上运行它。我使用 gcc 来编译代码,并使用 --ggdb 和 -mpreferred-stack-boundary=2 选项对其进行编译,并且我尝试了使用和不使用 -fno-stack-protector 选项。

这是代码:

#include<stdio.h>

char shellcode[] = "\xbb\x16\x00\x00\x00"
                   "\xb8\x01\x00\x00\x00"
                   "\xcd\x80";

int main(){

        int *ret;

        ret = (int *)&ret +2;

        (*ret) = (int)shellcode;

}
Run Code Online (Sandbox Code Playgroud)
  1. 首先定义一个名为 shellcode 的变量,该变量保存 shellcode。
  2. main函数被调用并定义了ret变量,该变量被加载到栈顶
  3. ret 变量的内存位置加上 2 个整数空间,即栈下 8 个字节的内存位置(返回指针的地址)被指定为 ret 变量的值。
  4. shellcode 变量的内存地址被写入由 ret 变量的值表示的内存地址 - 即返回地址。
  5. 当函数到达return指令时,就会执行shellcode,也就是exit函数。

我已经通过 gdb 运行了这个,一切似乎都检查出来了: shellcode 变量的内存位置是 0x804a01c

在 main 执行开始时,返回值位于第 3 个十六进制字并指向 …

c stack buffer-overflow shellcode

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

记忆入侵

前段时间我听说过内存入侵,当软件A的某些部分进入同一软件A的另一部分时,因此阻止程序正常工作.

内存入侵真的存在吗?我的意思是,我一直在使用C++,我知道数组可以无限增长,但它们能否其他结构上成长?如果数组不会生成MI,那会是什么?

buffer-overflow

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

为什么这段代码导致运行时错误?

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

int main()
{
  char *a = "Hello ";
  const char *b = "World";

  printf("%s", strcat(a, b));
  system("PAUSE");

  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

c buffer-overflow

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

关于缓冲区溢出

我是道德黑客世界的新手,其中一个最重要的事情是堆栈溢出,无论如何我编写了一个易受攻击的C程序,它有一个char名称[400]语句,当我尝试用401A运行程序时它不会不要溢出,但是我所遵循的这本书说它必须溢出而且逻辑意义如此说,那么什么是错的?

c stack-overflow buffer-overflow

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

不能在另一个函数中由malloc()分配的free()值

我有一个C函数,像这样:

void foo(char ** out) {
     *out = malloc(computedsize);
     if(*out != NULL){
         sprintf(*out, "%s,%s", foovar, baa);
      }
}
Run Code Online (Sandbox Code Playgroud)

然后我打电话给:

int main(void) {
   char * out = NULL;
   foo(&out);
   printf("%s\n", out); /* so far, it works fine */
   free(out); /* the problem. */ 
}
Run Code Online (Sandbox Code Playgroud)

我打电话的时候:

free(out);

它给出了:

*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x09a03050 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0x4ff161]
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0x5009b8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x503a9d]
./a.out[0x804875b]
./a.out[0x804871a]
./a.out[0x80486f9]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x4aabd6]
./a.out[0x8048601]
======= Memory map: ========
Run Code Online (Sandbox Code Playgroud)

//需要复制内存映射部分吗?

有人可以指出我的错误吗?我相信那是sprintf()......或者不,实际上,我不知道.我尝试过做内部功能的alloc值的新变量,然后*out = myvariable; …

c memory-management buffer-overflow

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

搜索跳转时WinDbg范围错误

我试图在程序的dll中搜索跳转,但是当我这样做时,我正在测量范围错误.有什么问题?

我的WinDbg输出如下:

0:000> g
ModLoad: 76390000 763ad000   C:\WINDOWS\system32\IMM32.DLL
ModLoad: 773d0000 774d3000   C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll
.
.
.
ModLoad: 10000000 10094000   C:\Program Files\SoriTong\Player.dll
ModLoad: 42100000 42129000   C:\WINDOWS\system32\wmaudsdk.dll
ModLoad: 00fd0000 0101f000   C:\WINDOWS\system32\DRMClien.DLL
ModLoad: 5bc60000 5bc9f000   C:\WINDOWS\system32\strmdll.dll
ModLoad: 71ad0000 71ad9000   C:\WINDOWS\system32\WSOCK32.dll
ModLoad: 71ab0000 71ac7000   C:\WINDOWS\system32\WS2_32.dll
ModLoad: 71aa0000 71aa8000   C:\WINDOWS\system32\WS2HELP.dll
ModLoad: 76eb0000 76edf000   C:\WINDOWS\system32\TAPI32.dll
ModLoad: 76e80000 76e8e000   C:\WINDOWS\system32\rtutils.dll
(830.964): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** WARNING: Unable to …
Run Code Online (Sandbox Code Playgroud)

exploit windbg reverse-engineering buffer-overflow

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

有没有必要让堆栈可执行?

拥有调用堆栈允许代码执行多年来一直是许多安全问题的根源.堆栈缓冲区溢出可用于利用编写错误的软件,其中可以执行存储在堆栈缓冲区中的代码.

我只是想知道是否真的有一个原因,它不仅仅是不可执行的?为什么调用堆栈上的任何内容都需要可执行?

也许有一些历史原因

security callstack buffer-overflow

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

为什么C没有像strcpy()那样使用的函数,并自动检查缓冲区大小以防止缓冲区溢出错误?

我真的不知道为什么会出现在C像没有的功能strcpy(),memcpy()等等,可自动检测该缓冲区的大小.表现得像这样的东西:

#define strcpy2(X, Y) strncpy(X, Y, sizeof(X))
Run Code Online (Sandbox Code Playgroud)

有人告诉我:"因为它是古老的语言." 但是,C不是一种死语言.IOS可以修复标准,并strncpy添加了新的功能.

其他人告诉我:"这会导致性能问题." 但是,我认为"如果这样的函数存在,你仍然可以在性能很重要的情况下使用旧函数.在所有情况下,你都可以使用该函数,你可以期待安全性的提高."

还有一些人告诉我:"那么,有一个像strncpy()"或"C是专为考虑这个问题的专业开发人员设计的",但strncpy()不会自动进行检查 - 开发人员必须确定缓冲区的大小,还是像大型程序一样Chrome由专业开发人员制作,具有缓冲区溢出漏洞.

我想知道为什么不能做出这样的功能的技术原因.


*英语不是我的母语.所以我猜有一些错误......抱歉.(编辑(cmaster):现在应该修复.希望你喜欢新的措辞.)

c buffer-overflow

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

如何通过gets将字符串输入到带有空字符的C?

我试图演示缓冲区溢出,我希望覆盖一个本地变量gets.我用gcc编译了我的程序-fno-stack-protector,所以我知道使用的缓冲区gets就在我试图覆盖的另一个局部变量的旁边.我的目标是溢出缓冲区并覆盖相邻变量,以便它们都具有相同的字符串.但是,我注意到我需要能够输入'\0'字符,以便strcmp实际显示两者都相等.我怎么输入'\0'

c gcc gets c-strings buffer-overflow

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