标签: buffer-overflow

这真的是缓冲区溢出吗?

我们使用的静态分析工具将类似于以下内容的C代码标记为关键缓冲区溢出.

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);
Run Code Online (Sandbox Code Playgroud)

该工具的错误消息是: 缓冲区溢出(数组索引超出界限):数组'buf'大小为1.数组'buf'可能使用0..64索引.

这合法吗?将字符数组赋值给空字符串是否真的导致其长度减少为单个字节,就好像它被定义为char buf [] = "";

c static-analysis buffer-overflow string-literals

3
推荐指数
2
解决办法
2927
查看次数

回推缓冲区溢出 - 但我的缓冲区还没有满?

我正在实现一个语法阅读器作为家庭作业的衍生产品,我正在读取一个 XML 文件,一次一个字符。我的目标是利用我通过实验室作业的代码,并改进结构和设计。

我有一个SyntaxReader继承自PushbackReader,它有一些额外的方法,如readAndExpect(char c),trimWhitespace()readUntilChar(char c)。然后我有一个XMLSyntaxReader继承SyntaxReader并添加了像readAttribute()and这样的功能readNode()(后者对树中的孩子递归......)。

我基本上只是从我的实验室作业中获取了工作代码,并将其粘贴到这种方法中的适当位置。然而,当我试图阅读第一个孩子时,我得到了一个IOException: Pushback buffer overflow我无法弄清楚的。

这是我的 XML 文件的开头:

<Biosfar namn="Liv">ar allt som fortplantar sig
    <Rike namn="Vaxter"> etc...
Run Code Online (Sandbox Code Playgroud)

我已经调试并观察了语法阅读器<R在子标签的开头一直成功阅读。此时,XMLSyntaxReader确认它是一个子标签,未读取最后两个字符(R<,按此顺序)并调用readNode()解析子节点。当我尝试 unread 时发生异常<

在调试器中,我也验证了 的私有pos变量PushbackReader确实设置为0,但我不知道为什么。我已经解析了一整行文本 - 为什么这些字符仍然不计算在内?

我会发布我的代码,但它很长,并且在我不确定我的确切实现是否相关之前同样有效。如果是,请指出我可以上传片段的地方,我将分享所有代码。

java buffer-overflow

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

什么可能导致此缓冲区溢出?

您好我正在尝试编译以下代码,

#include <stdio.h>
#include <string.h>
int main()
{
int i;
char a[3] = {'1', '2', '3'},b[3] = {'3', '2', '1'};
strcpy(a,b);
for(i=0; i<3; i++)
printf("%s",a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误(Buffer Overflow)

*** buffer overflow detected ***: ./prog terminated
======= Backtrace: =========
/lib/libc.so.6(__fortify_fail+0x48)[0xb7653ae8]
/lib/libc.so.6[0xb7651b30]
/lib/libc.so.6(__strcpy_chk+0x44)[0xb7650e14]
./prog[0x80484c9]
./prog[0x80483c1]
======= Memory map: ========
Run Code Online (Sandbox Code Playgroud)

现在我没有得到导致缓冲区溢出的原因.有人可以帮我解决一下吗?谢谢你的加入.

c string buffer-overflow

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

为什么这个C程序是梨形的?我打破了我的缓冲区吗?

我一直在尝试使用C语言.我通常使用PHP和JavaScript.

我做了"Hello World",然后输入了这个,我从某个网站复制了...

#include <stdio.h>
#include <stdlib.h>
#define MAX 20
int intcmp(const void*v1, const void *v2){
    return (*(int *)v1 - *(int *)v2);
}
main(){
    int arr[MAX], count, key , *ptr;
    printf("Enter %d integer values; press enter after each\n", MAX);
    for (count = 0; count < MAX; count++)
        scanf("%d", &arr[count]);
    puts("Press a key to sort the values");
    getc(stdin);

    qsort(arr, MAX, sizeof(arr[0]), intcmp);

    for(count=0; count < MAX; count++)
        printf("\narr[%d] = %d.", count, arr[count]);

    puts("\nPress a key to continue");
    getc(stdin);

    printf("Enter a val …
Run Code Online (Sandbox Code Playgroud)

c buffer-overflow

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

将十六进制字符作为参数传递的正确方法 - system()

我正在搞乱缓冲区溢出,我正在尝试执行返回libc漏洞.为了帮助我,我设计了以下perl脚本:

#!/usr/bin/perl

for ($i = 1; $i < 200; $i++) {
    print "count: $i\n";
    system("echo 1 | ./vuln " . "A"x$i . "\x20\x83\x04\x08AAAA\x5c\xf9\xff\xbf");
}
Run Code Online (Sandbox Code Playgroud)

以下是我定位的代码(./vuln):

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

main( int argc, char **argv)
{
    char buffer[80];
    printf("%d\n%s\n", strlen(argv[1]), argv[1]);
    getchar();
    strcpy(buffer, argv[1]);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

这是脚本的输出:

count: 1
1
A
count: 2
2
AA
count: 3
3
AAA
count: 4
4
AAAA
count: 5
5
AAAAA
Run Code Online (Sandbox Code Playgroud)

这表示最后一个字符串连接的部分(具有大量十六进制字符的部分)没有被成功传递为参数.

我在这做错了什么?

perl buffer-overflow

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

在发布模式下检测到缓冲区溢出 - linux

好的..我制作了一个使用 zlib 解压缩字符串的系统......我认为它有效,但我的 base64 转换器有问题,所以我不能确定数据是否正确......它适用于一个非常小的字符串,即“帮助”,但该字符串会导致缓冲区溢出“eJxjZMAOmHCIM+MQZ8EhzgrEAAKAABA=”

this is the function in question!

#include <zlib.h>
#include <stdlib.h>
#include <string.h>
#include "../../inc/tools/Zunz.h"

using namespace tool;

static const int maxUncompressedSize = 4096;

std::string Zunz::UnZip(std::string const& s)
{
    char *cmprsd;
    char uncompressed[maxUncompressedSize];
    int sizeOfS = sizeof(s);
    cmprsd = (char*) malloc(sizeOfS);
    strcpy(cmprsd, s.c_str());

    // deflate
    // zlib struct
    z_stream defstream;
    defstream.zalloc = Z_NULL;
    defstream.zfree = Z_NULL;
    defstream.opaque = Z_NULL;
    defstream.avail_in = (uInt)strlen(cmprsd)+1; // size of input, string + terminator
    defstream.next_in = (Bytef *)cmprsd; // input char …
Run Code Online (Sandbox Code Playgroud)

c++ linux zlib libc buffer-overflow

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

Ncurses/C/C++:使用getstr()并防止溢出(必须有更好的方法来执行此操作)

我目前正在进入我的第一个完整的C++项目,并且我遇到了Ncurses.

getstr()需要一个char数组作为输入,但是有了这个,就没有办法防止缓冲区溢出.让我假装我正在使用此输入来获取名称.我的代码将是以下内容:

int main(){
    char* nameTemp = new char[160];
    initscr();
    getstr(nameTemp);
    endwin();
    delete nameTemp;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是如果用户决定使用超过160个字符作为他的名字,会发生什么?我收到错误,程序失败.除了创建巨大的Char数组之外,有没有办法解决程序中的这种致命缺陷?谢谢.

注意:我正在使用带有g ++的Ubuntu 12.04

c c++ ncurses buffer-overflow

3
推荐指数
2
解决办法
6078
查看次数

如何将gdb观察点设置为存储在寄存器中的值?

我正在尝试检测某些函数中的堆栈溢出,并希望将观察点设置为RSP寄存器指向的内存.我不能只将一个观察点设置到某个地址,因为可以从不同的地方调用该函数.所以我想在函数的开始和结束时设置断点,并强制它们启用/禁用观察点.

但是设置观察点的方式都不适合我.例如,wa $rsp观看登记册; 该

set $myvar = $rsp
wa $myvar
Run Code Online (Sandbox Code Playgroud)

使观察点跟踪... $ myvar的变化!不是它存储的价值!

很奇怪,我敢肯定,这应该是一种方式,但我不知道一个......

UPD:看起来我在gdb中发现了一个bug.二:

(gdb) wa *$rsp
Attempt to dereference a generic pointer.
(gdb) set $myvar = $rsp
(gdb) wa *$myvar
Attempt to dereference a generic pointer.
Run Code Online (Sandbox Code Playgroud)

UPD:不知道为什么,但wa &*$myvar设置了$ myvar的断点,但不应该.错误?

stack-overflow debugging gdb breakpoints buffer-overflow

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

Python3和Python2之间的区别-socket.send数据

我正在练习一些缓冲区溢出技术,但是在发送已存储的数据时遇到了一个奇怪的问题。

我有这两个几乎相同的代码,除了在Python3代码中,我更改了sock.send以编码字符串(在Python2中不需要)

Python2代码:

import socket,sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect ((sys.argv[1], 10000))

buffer = "A"*268
buffer += "\x70\xfb\x22\x00"

#PAYLOAD:
buffer += ("\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50\x52"
"\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"
...
"\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5")

sock.send (buffer)
sock.close
Run Code Online (Sandbox Code Playgroud)

Python 3代码:

import socket,sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect ((sys.argv[1], 10000))

buffer = "A"*268
buffer += "\x70\xfb\x22\x00"

#PAYLOAD:
buffer += ("\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50\x52"
"\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"
...
"\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5")

sock.send (buffer.encode())
sock.close
Run Code Online (Sandbox Code Playgroud)

我发送缓冲区,然后使用抗扰度调试器检查EIP / SEP值,我发现在Python2代码和Python3代码之间得到了不同的值。那怎么可能?

两者的缓冲区相同,因此调试器中的EIP / SEP应该相同。

换句话说,从服务器的角度来看(获取套接字数据)看起来它获取了不同的数据结构或类似的东西。

有任何想法吗?

谢谢。

sockets buffer-overflow python-3.x

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

我正在尝试利用缓冲区溢出,我做错了什么?

我正在尝试使用本教程执行缓冲区溢出漏洞.我的帖子中的所有内容都将直接在GDB中执行.

https://www.reddit.com/r/hacking/comments/1wy610/exploit_tutorial_buffer_overflow/

这是我想利用缓冲区溢出的代码.

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

int     main(int argc, char *argv[])
{
  char  buff[256];

  if (argc == 1)
    {
      printf("Usage: %s input\n", argv[0]);
      exit (0);
    }
  strcpy(buff, argv[1]);
  printf("%s\n", buff);
  return (1);
}
Run Code Online (Sandbox Code Playgroud)

我目前正在研究Linux mint 18,我有64位处理器.鉴于我有64位架构.每个地址都是8个字节.现在让我们想象一下我当前的stakframe.


| buff [256] |


| RBP |


| 保存RIP |


我的目标是用"nop sled"的地址覆盖"SAVE RIP".鉴于我是64位架构.我打算用256 + 8字符填充变量buff.8个字符将用于覆盖RBP指针.我要用perl覆盖.

perl -e 'print "\x90" x 264'

然后使用我遵循的教程中提供的shellcode

perl -e 'print "\x90" x (264 - 26) . "\x90\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"'

我减去了26因为shellcode长度为26.

现在.我要找出使用GDB的nop雪橇的地址是什么.

   0x00000000004005f6 <+0>: push   rbp
   0x00000000004005f7 <+1>: mov …
Run Code Online (Sandbox Code Playgroud)

c gdb exploit buffer-overflow

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