type
status
category
date
slug
summary
tags
password
icon
📝 主旨内容
恶意代码复习
第一题
1.大多数操作系统都使用特权程序,比如LINUX系统的Set-UID特权程序。尽管特权程序提供了一些安全机制,但特权程序存在安全隐患。请阐述特权程序存在的必要性。
答:特权程序是为了执行需要高权限的任务而设计的。在操作系统中,有些任务要求超越普通用户权限的访问,例如管理系统配置、进行系统维护、或执行其他需要更高权限的操作。特权程序允许普通用户执行这些任务,同时系统管理员可以限制这些程序的权限,以提高系统的安全性。
2.Set-UID程序特权原理是什么?root拥有的Set-UID程序允许普通用户在执行程序时获得root权限。什么阻止了用户使用特权做恶意攻击?
答:Set-UID(Set User ID)是一种权限机制,允许用户在执行特定程序时暂时获得程序所有者的权限。对于root拥有的Set-UID程序,普通用户在执行该程序时可以暂时获得root权限。这种机制的阻止措施包括系统管理员对程序的权限限制、代码审查和其他安全措施,以确保恶意使用Set-UID权限的难度增加。
3.Set-UID程序特权存在哪些可能的攻击面?

答:特权升级攻击(Privilege Escalation):恶意用户可能尝试通过Set-UID程序的漏洞或不安全的输入来提升其权限。
竞态条件(Race Condition):恶意用户可能尝试在Set-UID程序执行之前修改程序,以执行恶意代码。
输入验证不足:缺乏对输入的充分验证可能导致恶意输入执行攻击。
用户输入
环境变量
能够被用户左右的系统输入
4. 试图将abc用户拥有的程序prog1转换为root拥有的Set-UID程序。运行以下命令可以达到目的吗?为什么? $sudo chmod 4755 prog1 $sudo chown root prog1
- 在某些Unix和类Unix系统中,当文件的所有权被更改时,出于安全考虑,系统可能会自动清除 Set-UID 位。这是为了防止安全漏洞,因为新所有者可能无意中获得了不应有的额外权限。但这种行为并不是所有系统都会发生,这取决于具体的操作系统和其配置。
在某些系统上,
chown 命令不会更改 Set-UID 位,而在其他系统上,执行 chown 可能会导致 Set-UID 位被清除。例如,在某些版本的 Linux 上,使用 chown 更改文件所有者不会影响 Set-UID 位,而在某些 UNIX 系统上,这样做可能会清除 Set-UID 位。因此,如果您在特定的系统上遇到 Set-UID 位被清除的情况,这可能是由于系统的特定行为。在实践中,如果您需要更改文件的所有者并设置 Set-UID 位,最好的做法是在执行
chown 后再次检查和设置所需的权限,以确保 Set-UID 位按预期设置。例如:这样可以确保无论
chown 如何影响权限,Set-UID 位都会被正确设置。第二题
环境变量是一组动态命名值,可以影响运行进程在计算机上的行为方式。大多数操作系统都使用它们。环境变量会影响程序行为,因此,如果一个程序使用了环境变量,则该程序可能存在漏洞。
(1)环境变量带来的攻击面有哪些?
答:路径注入(Path Injection):恶意用户可能通过篡改PATH等环境变量,使程序在执行时调用恶意程序而不是预期的程序。
命令注入(Command Injection):恶意用户可能通过操纵包含命令的环境变量,以执行意外的命令。
特权升级(Privilege Escalation):恶意用户可能通过篡改环境变量以获得更高权限。
信息泄漏:程序可能在错误的环境变量中存储敏感信息,导致信息泄漏。
书上的答案:

(2) 如何通过外部程序进行攻击?
(3)一个特权Set-UID程序需要找出它当前所在的目录。典型的做法有两种。 一种是使用 PWD 环境变量,其中包含当前目录的完整路径。 另一种方法是使用 getcwd() 函数。 请描述你准备采用哪种方法以及为什么。
答:使用 getcwd() 函数:推荐使用getcwd()函数而不是依赖环境变量,因为环境变量可能受到恶意修改的影响。
getcwd()函数是标准库函数,用于获取当前工作目录,不依赖于环境变量,并提供了更可靠的结果。
原因:安全性:环境变量可能被用户篡改,因此不是一个安全的方式来获取敏感信息。getcwd() 函数从文件系统中获取当前目录,更难以受到攻击。
可靠性:使用 getcwd() 函数可以确保获得程序实际运行的当前目录,而不会受到环境变量设置的干扰。
一致性:getcwd() 函数是平台无关的,因此程序在不同系统上的行为更一致。第三题
跨站脚本 (XSS) 是一种常见于 Web 应用程序中的漏洞。此漏洞使攻击者可以将恶意代码(例如 JavaScript 程序)注入受害者的 Web 浏览器。使用此恶意代码,攻击者可以窃取受害者的凭据,例如会话 cookie。 (1)使用LiveHTTPHeader,发现下面的GET请求是用来向www.example.com发送HTTP请求删除用户拥有的页面(只有页面的所有者才能删除该页面)。请编写一个恶意的JavaScript程序, 如果程序从 www.example.com 注入受害者的页面,它可以删除受害者拥有的页面。 http://www.example.com/delete.php?pageid=5 GET /delete.php?pageid=5 Host: www.example.com ... 答: 恶意JavaScript程序删除页面的攻击代码:
(2)XSS 和 CSRF 攻击有什么区别?
答:XSS(跨站脚本攻击):攻击者通过注入恶意脚本到受害者浏览器中,利用浏览器对网页的信任执行恶意操作。XSS攻击通常涉及窃取会话cookie等敏感信息。
CSRF(跨站请求伪造):攻击者通过欺骗用户在已经通过身份验证的会话中执行不期望的操作,而无需用户明确的授权。CSRF攻击可能导致在用户不知情的情况下执行潜在危险的操作,例如更改密码或发表言论。
(3)秘密令牌对策可以用来抵御XSS攻击吗?CSRF 攻击的同站 cookie 对策可以用来抵御 XSS 攻击吗?
答: 秘密令牌对抗XSS攻击:秘密令牌(CSRF令牌)通常用于防御CSRF攻击,而不是XSS攻击。XSS攻击注重在受害者浏览器中执行恶意脚本,而秘密令牌主要用于验证请求是否来自合法的、预期的源。
同站Cookie对抗XSS攻击:由于XSS攻击的本质是在用户浏览器中执行恶意脚本,同站Cookie对抗XSS攻击的效果有限。同站Cookie主要用于防御CSRF攻击,通过确保请求中包含了在Cookie中存储的令牌,以验证请求的合法性。然而,XSS攻击可以绕过同站Cookie的防御,因为攻击者可以在用户浏览器中执行任意脚本。
第四题
为了确保系统的安全与畅通,已有多种恶意代码的防范技术,如恶意代码分析技术、误用检测技术、权限控制技术和完整性技术等。恶意代码分析是一个多步过程,深入研究恶意软件结构和功能,有利于对抗措施的发展。按照分析过程中恶意代码的执行状态可以把恶意代码分析技术分成静态分析技术和动态分析技术两大类。 (1)恶意代码的作者通常会使用各种技术来规避防护机制,隐藏有害活动。其中有一种技术就是在可信进程中隐藏恶意代码。恶意代码常见的隐藏手段有哪些?请阐释恶意代码隐藏的具体步骤。

(2)误用检测也被称为基于特征字的检测,是目前检测恶意代码最常用的技术,主要源于模式匹配的思想。请简述基于特征字的检测过程。它具有哪些优点和缺点?
答:基于特征字的误用检测技术过程包括:
- 特征提取:从已知的恶意代码中提取特征字,例如独特的指令序列、API调用、字符串等。
- 特征存储:将提取的特征字存储在检测系统的数据库中。
- 扫描检测:当新的代码被引入系统时,系统对其进行扫描,检查是否包含已知的恶意特征。 优点: 高效:对于已知的恶意代码,检测速度较快。 易于实现:相对简单,易于部署。 缺点: 不能检测未知的恶意代码,对新型威胁的适应性较差。 易受到特征修改和代码混淆等技术的规避。

(3)恶意代码感染、破坏其他目标系统的过程,也是破坏这些目标完整性的过程。完整性技术就是通过保证系统资源,特别是系统中重要资源的完整性不受破坏,来阻止恶意代码对系统资源的感染和破坏。校验和法是完整性控制技术对信息资源实现完整性保护的一种应用,它是如何实现的?运用校验和法检查恶意代码有哪3种方法?校验和法有哪些缺点?

第五题
恶意代码(malicious code)又称为恶意软件(malicious software , Malware),是能够在计算机系统中进行非授权操作的代码。分类恶意代码的标准主要是代码的独立性和自我复制性。不具有自我复制能力的恶意代码必须借助其他媒介进行传播。
(1)恶意代码的编写大多是出于商业或探测他人资料的目的,如宣传某个产品、提供网络收费服务或对他人的计算机直接进行有意的破坏等。恶意代码有哪三个特征?
答:恶意代码的三个特征:
非授权操作:恶意代码能够在计算机系统中执行未经用户授权的操作,可能包括窃取敏感信息、破坏系统功能等。
商业或探测目的:大多数恶意代码的编写目的是出于商业动机,如推广产品、提供网络收费服务,或是对他人计算机进行破坏性的攻击。
传播手段:恶意代码可以具有自我复制的能力,通过感染其他文件或系统进行传播;或者依赖其他媒介,如社交工程、恶意链接等手段来传播。
(2)恶意代码问题,不仅使企业和用户蒙受了巨大的经济损失,而且使国家的安全面临着严重威胁。恶意代码的危害主要表现在哪几个方面?
答:恶意代码的危害方面:
经济损失:恶意代码造成企业和个人巨大的经济损失,包括数据丢失、生产中断、修复系统的费用等。
信息泄露:恶意代码可能窃取用户的敏感信息,导致个人隐私泄露,或者企业机密被泄露。
服务拒绝(Denial of Service,DoS):恶意代码可能用于发动DoS攻击,导致目标系统无法正常提供服务。
网络攻击:恶意代码可被用于网络攻击,包括分布式拒绝服务攻击(DDoS)等,危害网络的稳定性。
社会工程:恶意代码可能通过欺骗手段,利用社会工程学攻击用户,诱使其点击恶意链接或下载恶意文件。
(3)什么是独立的恶意代码?什么是非独立恶意代码?
答:独立的恶意代码和非独立恶意代码:
独立的恶意代码:指能够独立运行,不依赖其他文件或程序的恶意代码。这种恶意代码通常是自包含的,一旦激活,可以自行进行恶意活动,例如病毒(virus)和蠕虫(worm)。
非独立恶意代码:指需要依赖其他文件或程序进行传播和执行的恶意代码。这种恶意代码通常是作为附加到合法文件或程序中,需要被执行或打开才能发挥作用,例如木马(trojan horse)。非独立恶意代码无法自行传播,而是需要借助用户的操作或其他程序的执行来激活。
第六题
(1)如果 SQL 语句按照以下方式构造(在 WHERE 子句中换行),如何发动有效的 SQL 注入攻击吗?
SELECT * FROM employee WHERE eid= ’$eid’ AND password=’$password’
答:有效的 SQL 注入攻击:
如果 SQL 语句按照以下方式构造(在 WHERE 子句中换行),可以发动有效的 SQL 注入攻击。在这个例子中,假设用户输入的
$eid 和 $password 的值分别为 ' OR '1'='1'; --。
SELECT * FROM employee WHERE eid= '' OR '1'='1'; -- AND password=’' OR '1'='1'; --
上述注入代码的效果是使 WHERE 子句始终为真,绕过了密码验证,返回 employee 表中的所有记录。
(2)下面向数据库发送SQL语句,向数据库添加一个新用户,其中$name和$passwd变量的内容由用户提供,而EID和Salary字段由系统设置。 恶意员工如何将他/她的工资设置为高于 90000 的值?
$sql = "INSERT INTO employee (Name, EID, Password, Salary) VALUES (’$name’, ’EID6000’, ’$passwd’, 90000)";
答:添加新用户的 SQL 注入攻击:
如果
$name 和 $passwd 由用户提供,而 $EID 和 $Salary 由系统设置, 恶意员工可以通过向数据库发送以下内容,将他/她的工资设置为高于 90000 的值。
MaliciousName', 'EID6000', 'password', 100000);--
INSERT INTO employee (Name, EID, Password, Salary) VALUES ('MaliciousName', 'EID6000', 'password', 100000);--', 'EID6000', '$passwd', 90000);
在这个例子中,通过输入合适的 $name 值,员工将成功插入一条记录,并通过 SQL 注入攻击将工资设置为 100000。(3)请使用prepare语句修改以下程序。
$sql = "UPDATE employee SET password=’$newpwd’
WHERE eid =’$eid’ and password=’$oldpwd’";
答:使用 prepare 语句修改 SQL 更新程序:
使用 prepare 语句可以有效防止 SQL 注入攻击。以下是使用 prepare 语句修改 SQL 更新程序的示例:
// 使用 prepare 语句,使用占位符(?)代替变量
$sql = "UPDATE employee SET password=? WHERE eid =? and password=?";
$stmt = $conn->prepare($sql);
// 绑定参数到占位符
$stmt->bind_param("sss", $newpwd, $eid, $oldpwd);
// 执行准备好的语句
$stmt->execute();
使用 prepare 语句并绑定参数可以确保输入被视为数据而不是可执行的代码,从而防止 SQL 注入攻击。
第七题

1) 格式字符串漏洞解析:
a) 如果我们知道 fmt 存储在地址 0xAABBCDA4,可以构造输入,使得格式字符串指针指向攻击者提前准备好的恶意代码。输入内容如下:
"%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %nAAAAAAAAAAAAAAAA"
在这里,'%n' 是一个格式化字符串的转换说明符,它会将之前打印的字符数写入地址中。攻击者可以通过适当的排列来覆盖返回地址。
b) 如果 Region 2 和 Region 3 之间的距离不是 28 字节,而是 26 字节,可以构造以下格式字符串:
"%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %s %nAAAAAAAAAAAAAA"
这里 '%s' 是一个字符串格式说明符,它会读取内存地址并打印出该地址指向的字符串。
c) 为了利用不知道确切返回地址存储位置的情况,可以构造格式字符串:
"%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %nAAAAAAAAAAAAAAAA"
这样,无论返回地址存储在哪个地址,攻击者都能成功执行攻击。
最短格式字符串:
"%nAAAAAAAAAAAAAAAA"
(2) 格式字符串漏洞的危害:
通过格式字符串漏洞,攻击者可以实现以下危害:
1.执行任意代码:攻击者可以通过格式字符串漏洞在程序中注入恶意代码,执行任意指令,可能导致系统崩溃、信息泄露或其他危害。
2.读取内存:攻击者可以使用 '%s' 格式说明符来读取内存中的数据,包括敏感信息。
3.修改变量值:使用 '%n' 格式说明符,攻击者可以修改内存中的变量值,可能导致程序行为异常。
(3) 缓冲区溢出和格式字符串漏洞的区别:
1.定义区别:缓冲区溢出:是通过向缓冲区写入超出其容量的数据来覆盖相邻内存区域,常用于修改返回地址。 格式字符串漏洞:利用格式字符串中的格式化转换说明符,可以读取或写入内存中的数据。
2.不受限制:缓冲区溢出:可能受到栈保护机制等防御措施的限制,增加攻击难度。
格式字符串漏洞:通常更灵活,攻击者可以直接在栈上修改变量的值,更容易绕过防御措施。
答:
恶意程序可以通过篡改环境变量来影响程序的行为,例如修改PATH以使程序调用恶意的二进制文件。通过向环境变量中注入恶意的代码或命令,恶意程序可能会执行不受控制的操作。
两种:第一种使用exec()函数族,最终调用execve()系统调用将外部程序载入内存并执行,第二种使用system()函数,首先通过fork()函数创建一个子进程,最终调用execve()。
尽管两种方式最后都是使用了execve()函数,但攻击面非常不同:在第二种方式下,system()函数不直接运行外部程序就,它使用execve()函数来执行/bin/sh,然后使用shell程序执行外部程序。第一种方式下,外部程序将被直接执行,因此被攻击面是该程序和被调用的外部程序的攻击面的总和。第二种方式下,因为引入了“中间人”,攻击面是该程序、被调用的外部程序和shell程序的攻击面的总和。
shell程序会使用相当多的外部输入,因此他们的攻击面比一般程序要大。
- 作者:Guxi8086
- 链接:https://Guxi8086.com/article/1-30
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
