我刚刚读到GoogleGo如何在默认情况下使每个线程的堆栈大小减小,然后在发生溢出时链接到新堆栈(请参阅here中的第16页)。我想知道在C中执行此操作的最佳方法。我不得不说我不是C专家,所以可能有更好的方法来检测C上的堆栈溢出,但鉴于我的无知,我认为我会如何实现它:我首先想到的是,每次我们有一个新的堆栈时,我们都会得到一个堆栈变量的地址,这样我们就有了大致的起始堆栈地址。然后我们需要能够检索线程有多少堆栈空间。如果线程不是主线程,这是可能的,但我不知道我们如何在C上获取此信息。然后我们需要通过检索当前堆栈变量地址来检查(每个函数调用,它可能是)已经使用了多少堆栈。如果我们检测到可能的
在Linux上,我有一段代码使用在主函数内声明的数组,其中6位为2MB+1字节#include#include#defineMAX_DATA(2097152)/*2MB*/intmain(intargc,char*argv[]){/*Reserve1bytefornulltermination*/chardata[MAX_DATA+1];printf("Bye\n");return0;}当我在Linux上用gcc编译时,我运行它没有任何问题。但是在Windows上我得到一个运行时错误。运行它时我有5GB的可用内存。为了解决Windows上的问题,我需要指定其他堆栈大小:gcc-Wl,-
根据GrayHatHacking一书,“所有LinuxELF文件都映射到内存中,最后的相对地址为0xbfffffff”。通过从该地址中减去4个NULL字节、文件名的长度和shellcode的长度,显然可以将被利用缓冲区中的返回地址设置为环境变量的地址。但是,在尝试此操作时,在我看来,在我的64位Linux测试环境(禁用ASLR)中,堆栈不是从0xbffffff开始,而是从0xffffdfff开始。为什么我的堆栈起始地址与书中的地址不同?这与ALSR无关,因为地址不会每次都更改,但我想知道为什么我的地址从0xffffdfff开始,而不是书中的地址。想法?这是易受攻击的缓冲区:#inclu
在x86Linux系统上,某些情况会导致堆栈溢出:structmy_big_object[HUGE_NUMBER]在堆栈上。遍历它最终导致SIGSEGV。alloca()例程(类似于malloc(),但使用堆栈,自动释放自身,并且还会因SIGSEGV而爆炸如果太大)。更新:alloca()并没有像我最初所说的那样被正式弃用;只是气馁。有没有办法以编程方式检测本地堆栈对于给定对象是否足够大?我知道堆栈大小可以通过ulimit进行调整,所以我希望有一种方法(但它可能是不可移植的)。理想情况下,我希望能够做这样的事情:intmin_stack_space_available=/*???*/;
我正在研究一些安全相关的东西,现在我正在研究我自己的堆栈。我所做的应该是非常微不足道的,我什至没有尝试执行堆栈,只是为了表明我可以控制我的64位系统上的指令指针。我已经关闭了我所知道的所有保护机制,只是为了能够使用它(NX位、ASLR,也使用-fno-stack-protector-zexecstack进行编译)。我在64位汇编方面没有太多经验,在花了一些时间搜索和试验自己之后,我想知道是否有人可以阐明我遇到的问题。我有一个程序(下面的源代码),它只是将一个字符串复制到一个堆栈驻留缓冲区中,没有边界检查。然而,当我用一系列0x41覆盖时,我希望看到RIP被设置为0x4141414141
假设我们有如下代码:if(timeout>jiffies){/*wedidnottimeout,good...*/}else{/*wetimedout,error...*}当jiffies值不溢出时,这段代码工作正常。但是,当jiffies溢出并回绕到零时,此代码无法正常工作。Linux显然提供了处理这个溢出问题的宏#definetime_before(unknown,known)((long)(unkown)-(long)(known)当用这个宏替换时,上面的代码应该是安全的,不会溢出://SAFEAGAINSTOVERFLOWif(time_before(jiffies,timeo
我正在Linux上编写C++应用程序。我的应用程序有一个UDP服务器,它在某些事件上向客户端发送数据。UDP服务器还接收来自客户端的一些反馈/确认。为了实现这个应用程序,我使用了一个UDP套接字(例如intfdSocket)来发送和接收来自所有客户端的数据。我将这个socked绑定(bind)到端口8080并将套接字设置为NON_BLOCKING模式。我创建了两个线程。在一个线程中,我等待某个事件发生,如果事件发生,则我使用fdsocket将数据发送到所有客户端(在for循环中)。在另一个线程中,我使用fdSocket从客户端接收数据(recvfrom())。该线程计划每4秒运行一次(
考虑以下易受攻击的代码/程序:#includeintmain(intargc,char*argv[]){charbuf[16];strcpy(buf,argv[1]);return0;}在启用了NX和ASLR的运行Linux的IA-32(x86,32位)上,我将使用GOT覆盖技术来利用它,它主要包括以下步骤:溢出缓冲区直到RIP用strcpy@plt的地址覆盖RIP>使用来自.text的干净小工具,例如流行编辑;弹出ebp;ret,作为strcpy的返回地址为strcpy编写参数:&bss-address作为目标地址和一个字节的/bin/sh使用.text重复步骤2-4直到/bin/s
操作系统如何检测用户空间程序的堆栈溢出[然后向这些用户空间程序发送SIGTERM或SIGSEGV]? 最佳答案 保护页。当操作系统为程序创建堆栈时,它会分配比指定的多一点的空间。内存按页面分配(通常每页4KB),额外的页面将进行设置,以便任何访问它的尝试都会导致抛出异常。 关于linux-检测堆栈溢出,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7828677/
我想计算(或多或少)一段代码的确切指令数量。此外,我希望在通过特定数量的指令后收到信号。为此,我使用了由perf_event_open.我正在使用联机帮助页建议的第二种方式来实现溢出信号:SignaloverflowEventscanbesettodeliverasignalwhenathresholdiscrossed.Thesignalhandlerissetupusingthepoll(2),select(2),epoll(2)andfcntl(2),systemcalls.[...]TheotherwayisbyuseofthePERF_EVENT_IOC_REFRESHioc