首先从入口函数中探索, 点进start->sub_140001010->sub_1400721F0->sub_140081F40->sub_140071D12->sub_140071BA4看到了特征字符串: 搜索发现是 e8fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6Y4K9r3c8D9i4K6u0r3k6$3S2V1L8l9`.`. 该函数是库中ghdl\src\grt\grt-main.adb里的Check_Flag_String函数;
阅读该库得知是vhdl仿真库, 会将vhdl编译为机器码运行.
但程序中将很多特征字符串都抹除为了一串0oO..., 增加了识别grt函数代码的难度, 所以尝试hook+backtrace来找到主要逻辑. 这次用frida时要加上--kill-on-exit参数, 不然frida退出后会留下一个占满一个cpu的hardrock.exe进程需要手动结束.
用frida hook输入函数并打印调用栈, 发现程序中使用的是getc: 输出为: 其中关键位置为0x140059010, 属于函数sub_140057A20, 函数中有一个较大的类似switch指令码的switch case, hook switch的判断位置: 输入个1234得到: 虽然输出混在一起仍能得到switch的执行顺序为0 1 2 3 5 6 8 7 9 3 5, 其中0负责输入, 1 2 3为: 可以看到其中不存在算法, 重点在5; 观察case5中发生的函数调用, 发现有一个比较有趣的函数140044310: hook该函数发现它处理的就是输入的字符: 之后case 6 8 7 9 重点在9: compare_14000CB50函数为: 查看qword_1400C89D0内容为: size8_1400C8998 + 12处的值为8, 所以此处比较大小为8;
写hook观察compare_14000CB50在拿什么与qword_1400C89D0比较: 发现与输入1234经conv_140044310函数处理后的结果不同; 尝试改变输入为2234, 再观察: 发现比较内容与经conv_140044310函数处理后的结果的变化满足异或关系;
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288354.htm
[原创] KCTF 2025 第10题 涅槃,亦是新生wp
119 浏览
0 回复
暂无回复,快来抢沙发吧!