我正在尝试通过使用 gdb 内的 run < inputfile 重定向输入(以获取)来对 DVL 进行特定的利用
我可以成功地溢出程序,但在将十六进制值附加到字符串时遇到问题。我尝试过引用、将 mem addr 的值转换为 ascii 以及各种转义尝试(\、\、\),但没有成功
输入文件示例:AAAA\x42
在上面的示例中,反斜杠似乎被读取为 ascii 字符 (5c),并且值 42 保留在堆栈中(奇怪?)。
如何在 gdb 输入文件中指定十六进制值?
谢谢
我正在尝试遵循有关缓冲区溢出的教程(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)
我已经通过 gdb 运行了这个,一切似乎都检查出来了: shellcode 变量的内存位置是 0x804a01c
前段时间我听说过内存入侵,当软件A的某些部分进入同一软件A的另一部分时,因此阻止程序正常工作.
内存入侵真的存在吗?我的意思是,我一直在使用C++,我知道数组可以无限增长,但它们能否在其他结构上成长?如果数组不会生成MI,那会是什么?
#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程序,它有一个char名称[400]语句,当我尝试用401A运行程序时它不会不要溢出,但是我所遵循的这本书说它必须溢出而且逻辑意义如此说,那么什么是错的?
我有一个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; …
我试图在程序的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) 拥有调用堆栈允许代码执行多年来一直是许多安全问题的根源.堆栈缓冲区溢出可用于利用编写错误的软件,其中可以执行存储在堆栈缓冲区中的代码.
我只是想知道是否真的有一个原因,它不仅仅是不可执行的?为什么调用堆栈上的任何内容都需要可执行?
也许有一些历史原因
我真的不知道为什么会出现在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):现在应该修复.希望你喜欢新的措辞.)
我试图演示缓冲区溢出,我希望覆盖一个本地变量gets.我用gcc编译了我的程序-fno-stack-protector,所以我知道使用的缓冲区gets就在我试图覆盖的另一个局部变量的旁边.我的目标是溢出缓冲区并覆盖相邻变量,以便它们都具有相同的字符串.但是,我注意到我需要能够输入'\0'字符,以便strcmp实际显示两者都相等.我怎么输入'\0'?