我刚刚写了一个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"); 被跳过了.
我发布了这个问题,因为我不知道如何更改返回地址.
如果你帮助我,那将是很棒的.
谢谢
我的程序中有以下行导致运行时警告:
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在初始化后包含垃圾.所以看起来字符串初始化在这里被打破了.有没有人见过这个?
程序中有一些固定大小的二进制缓冲区用于存储数据.memcpy用于将缓冲区从一个缓冲区复制到另一个缓冲区.由于源缓冲区可能大于目标缓冲区.如何检测是否存在缓冲区溢出?
我刚发现有一个STATUS_STACK_BUFFER_OVERRUN和一个STATUS_STACK_OVERFLOW.那两个有什么区别?我刚刚发现堆栈溢出(堆栈耗尽)与堆栈缓冲区溢出不同,但要么它没有解释它,要么我不理解它.你能帮我吗?
关心托比亚斯
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) 我刚开始学习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
有没有办法可以向使用的scanf发出非ascii十六进制字符%s?我正在尝试插入十六进制字符\x08\xDE\xAD等等(以演示缓冲区溢出).
输入不是命令行参数,而是程序内的scanf.
考虑以下易受攻击的代码/程序:
#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覆盖技术来利用它,它基本上包括以下步骤:
strcpy@plt.text,例如pop edi ; pop ebp ; ret,作为返回地址strcpystrcpy:&bss-address as destination和one byte of /bin/shusing.text/bin/sh完全写入&bssstrcpywith system(使用偏移量,需要了解Libc的使用版本 - 让我们在这里忽略它)strcpy@plt堆栈,然后写入一些4字节的块,最后&bss指向的地址/bin/sh我想在x86-64上利用这一点,同时启用相同的缓解措施.但这更像想象的那样困难.基本上由于以下原因:
64位返回地址:x86-64中的RIP指向.text甚至不是32位长的RIP .因此,必须在堆栈上写入NULL字节以进行链函数调用.基本上,可以使用链式调用写入尽可能多的NULL字节,strcpy并利用NULL终止字符strcpy 始终写入.但是,只能strcpy通过覆盖RIP的最低有效字节来调用一次.
|0x00000000| (most significant …Run Code Online (Sandbox Code Playgroud)我正在学习堆溢出攻击,我的教科书提供了以下易受攻击的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)
我试图实现缓冲区溢出攻击,我需要知道我试图溢出的缓冲区的地址.
使用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
然后run
再p &buffer
然后地址是0xbffff330
编辑3:
这是重现行为的gdb日志:
$ gdb ./a.out
b主要
跑
这里的p&buffer/*地址与运行可执行文件时显示的不同*/
步骤通过程序到printf语句/*地址这里和p和缓冲区相同但不同于程序运行时打印的内容*/