韩国主播-宿舍 自慰 [原创] seccon2024 F is for flag wp 动态二进制插桩trace 破解函数式编程沾污-CTF抗拒-看雪-安全社区|安全招聘|kanxue.com
你的位置:韩国主播 > 性爱照片 > 宿舍 自慰 [原创] seccon2024 F is for flag wp 动态二进制插桩trace 破解函数式编程沾污-CTF抗拒-看雪-安全社区|安全招聘|kanxue.com
宿舍 自慰 [原创] seccon2024 F is for flag wp 动态二进制插桩trace 破解函数式编程沾污-CTF抗拒-看雪-安全社区|安全招聘|kanxue.com
发布日期:2024-12-11 20:45    点击次数:138

宿舍 自慰 [原创] seccon2024 F is for flag wp 动态二进制插桩trace 破解函数式编程沾污-CTF抗拒-看雪-安全社区|安全招聘|kanxue.com

上周莫得更新,一是因为上周在看seccon2024的另外两说念题(前菜),难度不大。直到际遇这说念F is for flag(正餐),卡的时辰相比久,一起原估量打算硬逆奈何功力不够(我知说念有其他大佬硬逆作念出来的)宿舍 自慰,临了遴荐使用trace器具碰碰命运,然后又在frida和pyda之间往复反复,frida的hook成果不尽东说念见地,最终遴荐pyda。

pyda是一款动态二进制插桩器具,不错通过编写python代码的风物达成hook杰出便捷。

官网先容:Pyda combines Dynamorio-based instrumentation with a CPython interpreter, allowing you to write hooks in Python that directly manipulate registers/memory in the target, without going through GDB or ptrace.

https://github.com/ndrewh/pyda

经典的flag查验:

题目由c++编写,ida通达点开main函数,会发现main函数内部发现内部有大批的std:variant, lambda闭包调用,何况其他函数齐是被mangle过的

在lamba#19中又有std::make_shared, std::variant,std::shared_ptr

std::make_shared经过一层层调用,最终会call到Cons::Cons,将v83(0xB7E9A2A4)存到cons里,背面的逻辑依此类推

到这里分析还算顺利,知说念跟到这个std::function()(lambda#1)

每一个std:function至少需要三层调用时刻到达真实逻辑

一层层跟进这个调用,函数调用递归一层接一层把我绕晕了,而且每一层代码还不少,东说念主工分析工程量很大,而且递归调用的地点不啻一处,对东说念主的挂念力也有很高的条件。总之,东说念主工分析的话,工程量大,难度大,何况有的地点不必简直逆。是以咱们想路,让器具补助咱们,找到主逻辑,然后咱们再通达ida逆向

使用pyda trace来追踪递次的主逻辑

最初搭建环境:

最初trace cmp,使用仓库中的example/cmplog.py trace cmp

不错看到递次输入“Wrong”之前的临了一个cmp,rcx=0x10 碰劲是咱们输入的长度,是以猜测rdx=0x40是flag的真实长度。

在“Wrong”往上找到一个很显着的cmp false trace

这里0x11793013一经在main函数中出现过宿舍 自慰,就在main函数起原的前16组的临了一个,是以猜测rdx=0x11793013为密文,rcx=0xc3df45f3为加密后的密文

不错发现照实rcx发生了变化,不错料定这即是临了的flag checker部分

刻下咱们详情了密文的长度,接下来咱们温顺的密文是若何被加密的,经过前期的逆向责任,咱们一经知说念Con:Cons() 最终会被调用来存储一个unsigned int,密文存储于此,那么明文也可能存储于此。

写剧本起原trace:

trace 终止

迷奸 拳交

不错看到第三组即是输入的明文

底下看第一组transform

不错看到明文到第一组密文作念了变换,那么具体的变换是若何作念的呢

要知说念transform是若何变换的,那就在transform完成的点backtrace,一步步往前回溯加密经由,直到找到加密逻辑。

写剧本进行backtrace:

底下截取了第一次临了一组和第二挨次一组的transform的backtrace:

不错看到backtrace有多少不同,放到diff 网站对比一下

插足ida搜检了0x8741和0x8e67处的逻辑,发现是不同的逻辑,推测这里即是不同的transform达成

底下通达ida,动态调考研证意象

第一组transform的backtrace为:

笔据前边的trace终止,transform的经由如下:

0x8741处的代码为:

经过gdb调试不错分析出:

最终一层层跟进,或者径直在diff临了一个不同的地址(0xf18e)起原跟会汗漫少许:

最终跟到first transformation的主逻辑:

gdb调试不错发现是浅易的sbox代换

邯郸学步,在0x8e67 发现second transformation的主逻辑:

不错发现是浅易的32位乘法:

考证:

邯郸学步,这里需要注重的是,在第三组索引13 14 15处的字符经过third transformation莫得蜕变,是以要追踪要看蜕变的index处的backtrace也即是12处:

diff一下,不错发现第一个不同的地址为0x983e:

不错发现主要逻辑在lambda#21中达成,逻辑不错追忆为:

考证:

背面的transformations,即是这三组transformation的轮回,需要注重的是third transformation的起原下标每次齐会加1,运转为12

编写剧本写出加密逻辑并笔据加密逻辑写出解密递次:

通过flag咱们不错看出,这是一个函数式编程沾污的递次,我遴荐抗拒的函数式编程沾污的风物是二进制插桩trace,来收复出递次的运行逻辑,其实函数式编程的沾污的最主要的留心即是通过函数彼此调用达成某种轮回的成果来进行末端流的沾污,要是咱们使用器具进行trace能收复出试验经由,那么函数式编程沾污的留心基本就破损支离了,这里使用pyda也算是振领提纲了,在解题经由中也商酌过使用frida,关联词frida attch的粒度省略到不了汇编领导这一块,或者说相沿关联词成果不尽东说念见地,在我想要输出的地点莫得输出,是以临了选择了二进制插桩器具达成trace,只可说简直好用,亦然我第一次使用pyda,特此写一篇博客纪录放学习心得,拜拜,下期见!

[培训]内核驱动高等班,冲击BAT一流互联网大厂责任宿舍 自慰,每周日13:00-18:00直播讲课

上传的附件: F_is_for_Flag.tar (446.50kb,2次下载)