所以我试图对此代码执行基于堆栈的缓冲区溢出:
#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 上运行
我很想知道,Delphi 是否容易受到缓冲区溢出攻击?我阅读了一些提到 Delphi 对该漏洞是安全的页面,因为“Delphi 可以使用 Pascal 字符串以及通用 Windows 字符串(PChar)。当与 Win API 接口时,除了使用 Pchar 之外别无选择”。真的吗?谢谢
进行一些基本的反汇编,并注意到由于某种原因,缓冲区被给予了额外的缓冲区空间,尽管我在教程中看到的内容使用相同的代码,但仅给出了正确的(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)
然而,这个视频 …
TStream是一个抽象类.
但是关于它的实现,它们是否缓冲溢出证明?
如果我从互联网上获取流,来自不是我的源,我该如何验证它是否已损坏并导致缓冲区溢出?
假设流是一个xml文件.
编辑:所有答案表明您需要检查缓冲区溢出.你能演示如何检查输入文件上的缓冲区溢出,我们知道流的定义可能是无限的吗?
我有以下用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) 我有2个系统:
我在两个系统上编译了以下代码:
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"数组.
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) 怎样才算最好的做法来处理什么的意思是一个字符串作为参数传递给函数,即
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终止符,并且当我们使用时我们没有跑到黑暗的一边我们期望什么是有效的字符串?
有没有办法让我用strlen获取字符串中的最后一个字符?如果没有,我无法理解strlen可以在什么情况下使用.
char buf[256] = "Hello";
char * lastchar = buf[strlen(buf) - 1];
Run Code Online (Sandbox Code Playgroud)
使用它安全吗?
我是系统安全的新手,我正在尝试实现一个简单的返回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()函数的参数在地址空间中的位置.任何人都可以帮我弄清楚我能在哪里找到这个论点?
我正在进行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) buffer-overflow ×10
c ×5
assembly ×3
delphi ×2
gdb ×2
security ×2
x86 ×2
c++ ×1
delphi-2009 ×1
gcc ×1
linux ×1
nop ×1
stack-memory ×1
tstream ×1
x86-64 ×1