8月2日学习打卡

IDA PRO的学习

由于对IDA PRO还是不甚了解,连writeup都看不懂,因此先对IDA PRO的使用方法进行一个系统性的学习。

主要通过以下两个网址:https://blog.csdn.net/wh_2396/article/details/53219600?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-4.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-4.nonecase

https://blog.csdn.net/xiangshangbashaonian/article/details/82748850?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159626552519724811838815%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159626552519724811838815&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-4-82748850.ecpm_v3_rank_business_v1&utm_term=IDA+PRO&spm=1018.2118.3001.4187

PWNTOOLS下载使用

除了分析时需要使用的ida,还需要使用pwntools编写的exp直接利用漏洞,在Windows周转了很久,发现pwntools不支持Windows平台下的python环境。故需要在虚拟机下安装python环境和pwntools。

下载pwntools的过程也算是曲折,好久没用Ubantu,先更新了pip,但是下载的时候仍然出现:

 

 多次出现红色错误,而众多文档中也没有提到过我出现的错误,所以只有靠自己依次实验,包括删除python2.7版本,或者试图下载anaconda管理python。猜到或许是下载速度的影响,最终在更换为国内镜像源之后成功安装pwntools。

 

 操作方法:https://blog.csdn.net/wangpengtai/article/details/100164241?biz_id=102&utm_term=pip%E4%B8%8B%E8%BD%BD%E5%8C%85%E6%8D%A2%E6%BA%90linux&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-100164241&spm=1018.2118.3001.4187

接下来就正式开始分析了:

使用checksec命令查看该文件

 

 发现这是一个64位的程序,除此之外,在这里学习一下checksec

checksec学习:

checksec是一个脚本软件,用来检查可执行文件属性,也就是可以查看文件有哪些保护机制。我们根据上图来看一下到底是哪样一些保护机制

RELRO

即重定向保护,是一种用于加强对 binary 数据段的保护的技术,大概实现由linker指定binary的一块经过dynamic linker处理过 relocation之后的区域为只读,设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。RELRO 分为 partial relro 和 full relro。

Stack

即栈检查保护,即会检查缓冲区,防止栈溢出。栈溢出保护是一种缓冲区溢出攻击保护手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护时,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。

NX

NX即不可执行的意思,NX的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。

PIE

即地址空间分布随机化机制,可以防范基于Ret2libc方式的针对NX的攻击,能有效阻止攻击者在堆栈上运行恶意代码。这样使得在利用缓冲溢出和移动操作系统中存在的其他内存崩溃缺陷时采用面向返回的编程(return-oriented programming)方法变得难得多。

 

继续分析,在对主函数分析时发现了一个callsystem函数,里面有个system,其拥有系统最高权限,而它和‘’‘/bin/sh‘”则可以为我们提供一个类似cmd的东西,好家伙,我们可以直接用它来查看修改操作等操作。这样一个可以获取系统权限的函数,我们可以手动去查找flag。

 

 而在主函数返回的vulnerable_function()中,返回的是一个输入,而read()会把参数fd0所指的文件传送count个字节到buf指针所指的内存中。而在本函数中,我们可以传送0x200长度的字节到长度只有0x80的buf所指的内存中去,漏洞就出现了,这个是一个栈溢出。也就是说我们的输入可以覆盖内存buf外的部分。

 

 使用shift+f12,查看主函数的内存地址,返现buf后跟的callsysytem,那么我们覆盖后,

stack of main:

 

strings of Windows:

 

 

 

 

posted @ 2020-08-02 23:11  三木森林  阅读(140)  评论(0编辑  收藏  举报