标签: buffer-overflow

C代码如何在代码中更改返回地址?

我刚刚写了一个C代码,如下所示:

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


void func(char *str)
{
        char buffer[24];
        int *ret;
        strcpy(buffer,str);
}

int main(int argc,char **argv)
{
        int x;
        x=0;
        func(argv[1]);
        x=1;
        printf("\nx is 1\n");
        printf("\nx is 0\n\n");
}
Run Code Online (Sandbox Code Playgroud)

请告诉我如何跳过printf("\nx是1 \n"); .之前我得到的线索是修改ret变量,它是函数func的返回地址.

您能否建议我如何更改上述程序中的返回地址,以便printf("\nx是1 \n"); 被跳过了.

我发布了这个问题,因为我不知道如何更改返回地址.

如果你帮助我,那将是很棒的.

谢谢

c exploit buffer-overflow

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

声明硬编码的std :: string会导致缓冲区溢出

我的程序中有以下行导致运行时警告:

if (!is_directory("C:\\NGFMS_Debug\\Files") && !create_directories("C:\\NGFMS_Debug\\Files"))
Run Code Online (Sandbox Code Playgroud)

警告的文本​​如下:"XXX.exe中发生缓冲区溢出,已损坏程序的内部状态."

警告来自对"is_directory(...)"的调用.我猜这个字符串的空间没有被分配,但我认为这样的语法是合法的.

is_directory函数是boost/filesystem.hpp的一部分,我使用以下命名空间:

using namespace boost;
using namespace boost::filesystem;
using namespace std;
Run Code Online (Sandbox Code Playgroud)

这是在VS2005 C++下编译的.有任何想法吗?

更新

我尝试了几个不同的东西并逐步完成了代码,这就是我找到的东西.

如果我这样做

char* path_chars_c;
path_chars_c = "C:\\Debug\\Files";
string path_str_c(path_chars_c);
Run Code Online (Sandbox Code Playgroud)

变量path_chars_c包含适当的字符串,但变量path_str_c在初始化后包含垃圾.所以看起来字符串初始化在这里被打破了.有没有人见过这个?

c++ string boost buffer-overflow

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

如何防止memcpy缓冲区溢出?

程序中有一些固定大小的二进制缓冲区用于存储数据.memcpy用于将缓冲区从一个缓冲区复制到另一个缓冲区.由于源缓冲区可能大于目标缓冲区.如何检测是否存在缓冲区溢出?

c buffer-overflow memcpy fortify-source

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

STATUS_STACK_BUFFER_OVERRUN和STATUS_STACK_OVERFLOW有什么区别?

我刚发现有一个STATUS_STACK_BUFFER_OVERRUN和一个STATUS_STACK_OVERFLOW.那两个有什么区别?我刚刚发现堆栈溢出(堆栈耗尽)与堆栈缓冲区溢出不同,但要么它没有解释它,要么我不理解它.你能帮我吗?

关心托比亚斯

windows stack-overflow buffer-overflow buffer-overrun

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

AudioRecord:缓冲区溢出?

RECORDING使用我的应用程序时,我正在获得缓冲区溢出.录音在a中执行Service.我无法弄清楚为什么我收到这条消息AudioFlinger.

下面我实例化AudioRecord对象并设置它的回调.

bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);
aRecorder = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize);

aRecorder.setRecordPositionUpdateListener(updateListener);

bytesPerSample = bitsPerSample / 8;
int bytesPerFrame = nChannels * bytesPerSample;
framePeriod = bufferSize / bytesPerFrame; // nr of frames that can be kept in a bufferSize dimension    
int result = aRecorder.setPositionNotificationPeriod(framePeriod);    
buffer = new byte[bufferSize];
Run Code Online (Sandbox Code Playgroud)

audioRecord回调:

private AudioRecord.OnRecordPositionUpdateListener updateListener = new AudioRecord.OnRecordPositionUpdateListener(){
        public void onPeriodicNotification(AudioRecord recorder){
            int result = aRecorder.read(buffer, 0, buffer.length);
        }

        public void onMarkerReached(AudioRecord …
Run Code Online (Sandbox Code Playgroud)

android buffer-overflow audiorecord android-audiorecord

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

addressSanitizer:地址上的堆缓冲区溢出

我刚开始学习C。

我试图编写一个函数来打开文件,读取BUFFER_SIZE,将内容存储在数组中,然后跟踪字符'\n'(因为我想获取输入的每一行)。

当我设置BUFFER_SIZE非常大时,我可以得到第一行。当我将BUFFER_SIZE合理的小数值(例如42)设置为第一行的末尾时,它会在末尾打印出一些奇怪的符号,但我猜这是我自己的代码中的一个错误。

但是,当我将其设置得BUFFER_SIZE非常小时,例如= 10,然后使用-fsanitizer=address来检查内存泄漏。它抛出错误的怪物:

==90673==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000fb at pc 0x000108868a95 bp 0x7fff573979a0 sp 0x7fff57397998
READ of size 1 at 0x6020000000fb thread T0
Run Code Online (Sandbox Code Playgroud)

如果有人可以从一般意义上解释我:

  • 什么是fsanitizer =地址标记?

  • 什么是堆缓冲区溢出?

  • 什么是地址和线程?在屏幕上以彩色显示线程的标志是什么?

  • 以及为什么它说“在地址读取大小为1。”?

我真的很感激<3

c heap memory-leaks buffer-overflow

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

输入非ASCII字符到scanf("%s")

有没有办法可以向使用的scanf发出非ascii十六进制字符%s?我正在尝试插入十六进制字符\x08\xDE\xAD等等(以演示缓冲区溢出).

输入不是命令行参数,而是程序内的scanf.

c format scanf buffer-overflow

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

在启用了NX(DEP)和ASLR的x86-64上利用基于字符串的溢出

考虑以下易受攻击的代码/程序:

#include <string.h>

int main(int argc, char *argv[]) {
    char buf[16];
    strcpy(buf, argv[1]);

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

在启用了NX和ASLR的运行Linux的IA-32(x86,32位)上,我将使用GOT覆盖技术来利用它,它基本上包括以下步骤:

  1. 溢出缓冲区直到RIP
  2. 使用地址覆盖RIP strcpy@plt
  3. 使用干净的小工具.text,例如pop edi ; pop ebp ; ret,作为返回地址strcpy
  4. 写入以下参数strcpy:&bss-address as destination和one byte of /bin/shusing.text
  5. 重复步骤2-4直到/bin/sh完全写入&bss
  6. 覆盖GOT-entry strcpywith system(使用偏移量,需要了解Libc的使用版本 - 让我们在这里忽略它)
  7. 写入strcpy@plt堆栈,然后写入一些4字节的块,最后&bss指向的地址/bin/sh
  8. 利润

我想在x86-64上利用这一点,同时启用相同的缓解措施.但这更像想象的那样困难.基本上由于以下原因:

  1. x86-64基于寄存器的调用约定:函数参数使用寄存器而不是堆栈传递.因此,需要一些额外的ROP小工具将参数从堆栈传输到适当的寄存器中.这是一个小问题,但也受以下问题的影响:
  2. 64位返回地址:x86-64中的RIP指向.text甚至不是32位长的RIP .因此,必须在堆栈上写入NULL字节以进行链函数调用.基本上,可以使用链式调用写入尽可能多的NULL字节,strcpy并利用NULL终止字符strcpy 始终写入.但是,只能strcpy通过覆盖RIP的最低有效字节来调用一次.

    |0x00000000|        (most significant …
    Run Code Online (Sandbox Code Playgroud)

linux dep x86-64 buffer-overflow aslr

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

堆溢出攻击

我正在学习堆溢出攻击,我的教科书提供了以下易受攻击的C代码:

/* record type to allocate on heap */
typedef struct chunk {
    char inp[64];            /* vulnerable input buffer */
    void (*process)(char *); /* pointer to function to process inp */
} chunk_t;

void showlen(char *buf)
{
    int len;
    len = strlen(buf);
    printf("buffer5 read %d chars\n", len);
}

int main(int argc, char *argv[])
{
    chunk_t *next;

    setbuf(stdin, NULL);
    next = malloc(sizeof(chunk_t));
    next->process = showlen;
    printf("Enter value: ");
    gets(next->inp);
    next->process(next->inp);
    printf("buffer5 done\n");
}
Run Code Online (Sandbox Code Playgroud)

但是,教科书没有解释如何修复此漏洞.如果有人能够解释漏洞以及修复它的方法那将是很好的.(部分问题是我来自Java,而不是C)

c buffer-overflow

6
推荐指数
2
解决办法
633
查看次数

gdb显示与代码不同的地址

我试图实现缓冲区溢出攻击,我需要知道我试图溢出的缓冲区的地址.

使用GDB显示的地址与我在代码中执行此操作时的地址不同:

确切的代码:

#include<stdio.h>

int main() {
   char buffer[20];
   printf("%p\n", buffer); // 0xbffff320

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

但是,如果我这样做在gdb中:

p &buffer
Run Code Online (Sandbox Code Playgroud)

我明白了: 0xbffff330

为什么会有差异,它会搞砸我的缓冲区溢出攻击?

我禁用了ALSR和堆栈防护.

谢谢.

编辑1:即使我单步执行gdb并遇到打印行,我也会得到0xbffff320作为地址

编辑2:

环境:在Windows 7上的虚拟框中运行Ubuntu Linux 9映像.

gdb版本:6.8-debian

使用GCC编译,例如:gcc -g -fno-stack-protector filename.c 立即执行:./a.out 地址打印:0xbffff320

然后,在这样的调试器打开:gdb ./a.out 然后输入b main 然后runp &buffer

然后地址是0xbffff330

编辑3:

这是重现行为的gdb日志:

$ gdb ./a.out

b主要

这里的p&buffer/*地址与运行可执行文件时显示的不同*/

步骤通过程序到printf语句/*地址这里和p和缓冲区相同但不同于程序运行时打印的内容*/

c gcc gdb pointers buffer-overflow

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