【安全工具】IDAPython:一个可以解放双手的 IDA 插件
针对这些了解CTF赛事的人而言,時间分派是十分关键的1个难题,人们必须科学安排好時间,尽量多的评分。你见到的大部分题型的write-up都应用了自动化技术的脚本制作来全自动进行某些繁杂的或是并不是手工制作进行的每日任务。这不但节约了時间,更节约了活力,由于答题人只必须一次弄清楚必须反复实行的內容,剩余的就能够交到脚本制作去干了。这就是说人们面临的挑战。
人们如今必须处理的题型来源于Nuit?Du?Hack?Quals?2018,题名是""Matrioshka:?Step?4(I?did?It?again)"",一条逆向工程题。人们会见到,要是手工制作解决得话,不但会花销反向手几小时時间,还会让碰触用以查验键入是不是恰当的编码更为艰难。
文中的总体目标是撰写1个PHP在线解析脚本制作,它将会自动化技术的进行题型,随后在结尾輸出flag。
人们先讨论一下人们已经解决的是哪些的二进制文件
人们如今必须做的是设定远程控制CDB调试器,随后从IDA64联接到文档
该程序流程期待人们键入334个字符,人们照做就行
查验长短后,crackme用到memalign分配内存居中的运行内存块。它将紧接着应用mprotect来改动页应对RWX的管理权限。
拷贝到该块的统计数据从sub_40089D刚开始到sub_422C0C(不包含sub_422C0C)。这2个详细地址中间的某些內容说明将会这儿会有某些及时的编码破译全过程。
接下去,应用下列主要参数启用分派网页页面中的“sub_40089D”任务。
要是键入的主要参数是恰当的,返回值为0x1。
到现在为止还挺不错。如今人们讨论一下sub_40089D干了哪些。
人们见到它遍历出示的键入的每一空格符,并实行下列实际操作:
载入空格符2次
将其储存在局部变量中
再度载入空格符并将其加1。比如,A变成B等等等等
用提升的值替换成运行内存中的初始空格符
从局部变量修复它
或许许多人会把它当作废弃物编码,由于它事实上做的仅仅改动了1个空格符,随后将其复原到以前的內容。其实,这是根据应用硬件配置断点体制开展对flag优化算法检测个人行为开展安全防护。要是只应用多次得话,这类维护会十分弱,但实际上,它在程序流程的全部实行全过程中被应用了十多次,这将大大增加手动式查验flag优化算法的時间。
如今我们一起看一下代码加密的一部分,人们不容易深层次到太关键点地区,简易而言每一涵数都开展了下列实际操作:
实行人们以前看了的反硬件配置断点方法
应用简易的XOR优化算法数据加密同样作用的最终几条命令(在LEAVE;?RETN以前)
用简易的XOR优化算法破译下个被启用的涵数
启用破译涵数
回到后破译最终几条命令,随后继续执行,进而回到给调用者(人们直至键入恰当才会回到)
一样的全过程在0x40089D到0x40C305被执行(分派区块链中的等效详细地址),因而人们大约有56kb的编码是除开破译本身和浏览(读写能力)客户键入以外什么都不想做。
你将会想要知道我就是怎样了解一段作用是在0x40089D到0x40C305被执行的,或许也没有狂按F9打几百次断点,这儿就是说IDAPython充分发挥的地区了。
在刚开始撰写脚本制作以前,人们必须做某些假定:
调节二进制文件前,人们只有实行全部实际操作中的4个涵数。因此我的第一位假定是除开最终查验輸出的作用之外,全部事件作用是相同的。
下一个假定是有关HW断点维护的,这都是最关键的假定。我觉得查验键入的涵数是在全部别的涵数实行完以后才会实行的,也就是说最终才会被启用。要是查验键入是在中后期实行的,那么也就代表人们会在键入被查验完以后还会再做许多没用的硬件配置断点,我选用的方式就不容易起功效,那时人们就必须大量的规范来判断。
好运的是人们全部的假定全是恰当的,下边的脚本制作可以帮人们寻找第一位被确定的空格符的部位
人们最先建立1个空目录来储存全部详细地址(RIP),至少调试器将因为读/写硬件配置断点而中止系统进程。接下去,在prepare涵数中,可以看在CALL命令中改动出示给mprotect的详细地址主要参数和RAX寄存器(图4)。我那样做由于IDA在后边环节试着解决硬件配置断点时(下一个脚本制作)会奔溃。我不知为什么会那样。
从涵数回到时,调试器依然脱机在CALL?RAX,人们能够根据在RDX上引证表针来将表针获取到人们的字符串。
紧接着,人们在字符串的第一位空格符上设定了1个读/写硬件配置断点。在此之后,人们键入1个循环系统,再次将详细地址(RIP)额外到目录中。循环系统再次,直至系统进程撤出(event!=?BREAKPOINT)。最终,人们删掉读/写硬件配置断点,并打印硬件配置断点的第一个详细地址。也就是说编码查验出示的键入的实效性的部位。
它是人们从IDA获得的輸出:
人们如今要做的就是说去看包括在0x40c336里的涵数的作用是啥。以便弄清楚这一点儿,人们还必须在该详细地址设定1个实行硬件配置断点(
相关文章
- 3条评论
- 语酌俗野2022-05-28 15:00:50
- 断点而中止系统进程。接下去,在prepare涵数中,可以看在CALL命令中改动出示给mprotect的详细地址主要参数和RAX寄存器(图4)。我那样做由于IDA在后边环节试着解决硬件配置断点时(下一个
- 绿邪旧竹2022-05-28 16:51:47
- 狂按F9打几百次断点,这儿就是说IDAPython充分发挥的地区了。 在刚开始撰写脚本制作以前,人们必须做某些假定: 调节二进制文件前,人们只有实行全部实际操作中的4个涵数。因此我的第一位假定是除开最终
- 泪灼命轴2022-05-28 21:18:23
- _422C0C(不包含sub_422C0C)。这2个详细地址中间的某些內容说明将会这儿会有某些及时的编码破译全过程。 接下去,应用下列主要参数启用分派网页页面中的“sub_40089D”任务。