标签: buffer-overflow

尝试调用缓冲区溢出的隐藏函数

所以我试图对此代码执行基于堆栈的缓冲区溢出:

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

void win()
{
  printf("well done!");
}

void vulnfunc(){
  char buffer[36];
  gets(buffer);
  printf("Buffer contents are %s\n",buffer);
}

int main(int argc,char**argv){
  vulnfunc();
}

Run Code Online (Sandbox Code Playgroud)

所以我用 44 个字节覆盖了 EIP(缓冲区的 36 个字节和额外的 8 个字节)。然后我得到了函数 win 的地址,将其更改0x53e58955为适当的地址,如下所示

\x55\x89\xe5\x53
Run Code Online (Sandbox Code Playgroud)

当我将两个字符串连接在一起作为输入时,它仍然不会调用该win()函数。我尝试添加"BBBB"填充来填充 ebp,但也没有运气。如果有人可以提供一些建议,我将非常感激。

它在 Ubuntu、x86_64 上运行

c stack-overflow gdb buffer-overflow

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

Delphi中的缓冲区溢出漏洞

我很想知道,Delphi 是否容易受到缓冲区溢出攻击?我阅读了一些提到 Delphi 对该漏洞是安全的页面,因为“Delphi 可以使用 Pascal 字符串以及通用 Windows 字符串(PChar)。当与 Win API 接口时,除了使用 Pchar 之外别无选择”。真的吗?谢谢

delphi security buffer-overflow

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

使用未优化的 C (GCC) 固定大小缓冲区的 x86-32 和 x64 汇编堆栈分配的差异

进行一些基本的反汇编,并注意到由于某种原因,缓冲区被给予了额外的缓冲区空间,尽管我在教程中看到的内容使用相同的代码,但仅给出了正确的(500)个字符长度。为什么是这样?

我的代码:

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

int main (int argc, char** argv){
    char buffer[500];
    strcpy(buffer, argv[1]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

用GCC编译,反汇编代码为:

   0x0000000000001139 <+0>:     push   %rbp
   0x000000000000113a <+1>:     mov    %rsp,%rbp
   0x000000000000113d <+4>:     sub    $0x210,%rsp
   0x0000000000001144 <+11>:    mov    %edi,-0x204(%rbp)
   0x000000000000114a <+17>:    mov    %rsi,-0x210(%rbp)
   0x0000000000001151 <+24>:    mov    -0x210(%rbp),%rax
   0x0000000000001158 <+31>:    add    $0x8,%rax
   0x000000000000115c <+35>:    mov    (%rax),%rdx
   0x000000000000115f <+38>:    lea    -0x200(%rbp),%rax
   0x0000000000001166 <+45>:    mov    %rdx,%rsi
   0x0000000000001169 <+48>:    mov    %rax,%rdi
   0x000000000000116c <+51>:    call   0x1030 <strcpy@plt>
   0x0000000000001171 <+56>:    mov    $0x0,%eax
   0x0000000000001176 <+61>:    leave  
   0x0000000000001177 <+62>:    ret  
Run Code Online (Sandbox Code Playgroud)

然而,这个视频 …

c assembly x86-64 buffer-overflow stack-memory

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

tstream是缓冲区溢出证明吗?

TStream是一个抽象类.

但是关于它的实现,它们是否缓冲溢出证明?

如果我从互联网上获取流,来自不是我的源,我该如何验证它是否已损坏并导致缓冲区溢出?

假设流是一个xml文件.

编辑:所有答案表明您需要检查缓冲区溢出.你能演示如何检查输入文件上的缓冲区溢出,我们知道流的定义可能是无限的吗?

delphi buffer-overflow delphi-2009 tstream

0
推荐指数
2
解决办法
557
查看次数

可能的缓冲区溢出问题

我有以下用C++编写的代码来提取片表数据结构中的给定范围的文本.以下是类PieceTable的函数,它将给定范围的文本存储在字符数组中buffer:

void PieceTable::getTextInRange(unsigned __int64 startPos, unsigned __int64 endPos, char buffer[]){

    char* totalBuffer = new char[getSize() + 2];

    getBuffer(totalBuffer);

    if(endPos >= getSize())
        endPos = getSize() - 1; 

    cout<<"startPos : "<<startPos<<endl;
    cout<<"endPos : "<<endPos<<endl;

    memcpy(buffer, &totalBuffer[startPos], endPos - startPos + 1);

    buffer[endPos - startPos + 2] = '\0';

    if(totalBuffer != 0)
        delete[] totalBuffer;
    totalBuffer = 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我用来测试这段代码的main方法中的一段代码:

temp2 = new char[end - start + 2];  //changing 2 to 3 solves the problem
pieceTable.getTextInRange(Start, end, temp2);
for(int i = 0; …
Run Code Online (Sandbox Code Playgroud)

c++ buffer-overflow

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

在x86_64和i686上编译时,NOP字符0x90的printf不同

我有2个系统:

  1. 3.13.0-35-generic ... x86_64 x86_64 x86_64 GNU/Linux with gcc:4.8.2
  2. 2.6.32-21-generic#32-Ubuntu ... i686 GNU/Linux with gcc:4.4.3

我在两个系统上编译了以下代码:

int numOfNops = 600;
unsigned char nops[numOfNops];
int i;
for (i=0; i < numOfNops; i++) {
    nops[i] = '\x90';
}
...
printf("GET /%s%s\x90\x90%s HTTP/1.0 \n", nops, buf, ESPs);
Run Code Online (Sandbox Code Playgroud)

问题是打印"nops"数组.

  1. 当我在64位系统#1上运行它时,输出看起来就像我想要的那样.
  2. 当我在32位系统#2上运行它时,printf()输出的NOP部分包含其他奇怪的字符,即:

Hexdump系统#1

00000250  90 90 90 90 90 90 90 90  90 90 90 90 90 89 e3 da  |................|
00000260  c4 d9 73 f4 5f 57 59 49  49 49 49 49 49 …
Run Code Online (Sandbox Code Playgroud)

c linux gcc buffer-overflow nop

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

不受信任的char指针参数

怎样才算最好的做法来处理什么的意思是一个字符串作为参数传递给函数,即

int use_the_force(const char *dark_side_file_name) {
  char *safe_force_it_is = Yoda(dark_side_file_name);
  return useTheForceYouCan(safe_force_it_is);
}   
Run Code Online (Sandbox Code Playgroud)

假设调用者是Darth Vader,为了确保当我们在"safe_force_it_is"上使用strlen/strnlen或memchr这样的东西时,会有一个NULL终止符,并且当我们使用时我们没有跑到黑暗的一边我们期望什么是有效的字符串

c security buffer-overflow

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

在C中获取字符串中的最后一个字符时,strlen是否不安全

有没有办法让我用strlen获取字符串中的最后一个字符?如果没有,我无法理解strlen可以在什么情况下使用.

char buf[256] = "Hello";
char * lastchar = buf[strlen(buf) - 1];
Run Code Online (Sandbox Code Playgroud)

使用它安全吗?

c buffer-overflow

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

在x86_64汇编实验中,stdlib.h的system()函数的参数在哪里?

我是系统安全的新手,我正在尝试实现一个简单的返回libc漏洞.有了GCC的-fno-stack-protector设置,现在我知道如何利用缓冲区溢出错误来粉碎返回地址.现在我想system()通过覆盖函数的正确返回地址来引导目标程序的控制流程到C 函数system()(我用-static选项集编译程序,以便所有C的标准函数都在可执行代码中) .例如,目标程序如下:

int main(int argc, char *argv[]) {
    char buffer[8];
    gets(buffer);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以main()使用system()gdb的反汇编函数找到的地址覆盖返回地址.我想提供"/ bin/sh"作为参数system(),但我不知道system()函数的参数在地址空间中的位置.任何人都可以帮我弄清楚我能在哪里找到这个论点?

x86 assembly buffer-overflow

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

当我在GDB中单步执行缓冲区溢出时,为什么我的CC INT3指令没有做任何事情?

我正在进行protostar漏斗练习#5.

基本上这是代码,目标是将代码执行重定向到shellcode.我的问题只涉及为什么我的指令没有执行.

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

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}
Run Code Online (Sandbox Code Playgroud)

这是一个缓冲区溢出问题.我已成功将返回地址重定向到我的nop sled的开头,然后是int3"\ xcc"shellcode,它阻止程序执行(只是检查它是否会执行)

"\x90\x90\x90\x90\xcc\xcc\xcc\xcc"
Run Code Online (Sandbox Code Playgroud)

基本上,当我走过我的nop雪橇时,它只是说

0xbffff7a2 in ?? ()
(gdb)
0xbffff7a3 in ?? ()
(gdb)
0xbffff7a4 in ?? ()
(gdb)
Run Code Online (Sandbox Code Playgroud)

请记住,我已成功将代码重定向到这些地址,并且我将这些地址分别视为"\ x90"和"\ xcc".但没有任何反应.该程序甚至没有收到来自"\ xcc"的中断.

我可能没有提供足够的信息,但基本上它应该执行这些指令,但似乎没有.

我想可能是指令需要字节对齐?但这甚至重要吗?

我想知道为什么即使你指向那个地址也不能执行指令的原因是什么.

This is x86 Architecture machine. 
Run Code Online (Sandbox Code Playgroud)

x86 assembly gdb buffer-overflow

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