首先看看第一道题目:[网鼎杯 2020 青龙组]singal无壳32位:直接拖ida中分析:先进入main函数看看:下面这个vm_operad函数应该跟进去看:这一大长串.....那么只能动态分析了:在main函数中下个断点,然后单步进入vm_operad函数:发现这个read是输入函数:跟进去一看,flag的长度必须是15位:然后程序首先进入case10分支,还有接下来的分支我看着这么多case分支,想直接用递归调用的脚本来解题:就是直接让程序从case10分支利用函数递归调用输出flaga1就是前面的那个复制过来的字符串:跑一下出来了:
在看第二道:[网鼎杯 2020 青龙组]jocker:(玩笑,感觉这个题目肯定有点坑)无壳32位,直接拖ida进入main函数之后,ida说堆栈有错误:这好办啊,修改堆栈就行了:在main函数中仔细找找:发现了这里虽然调用的同一个函数 call __Z7finallyPc,但是堆栈指针不一样,那你肯定有问题:直接按套路来修改指针,函数的位置按下alt+k,修改新旧sp指针的差值,改为0:这样看着就舒服多了:好了可以分析了:简单的修改一下参数名称,加一些注释,便于之后的分析:接下来就要分析这个wrong和omg函数了:先看wrong函数:非常清晰,对输入的字符串进行了减法和异或操作再看omg函数:也非常清晰,就是将输入的input字符串与str_t字符串相比,要让程序正常运行,就必须相等这是str_t里面的数据直接上脚本跑一下:发现flag不对.....动态挂起来看看吧(这个jocker真让我猜对了有问题)发现在最后的这个循环里面,对copy后的flag进行了操作,就是那个encrypt(名字都是加密)的加密函数进行操作的,而且这个函数打开这是个啥啊:这么长的for循环,直接上od下断点dump这个函数出来看看吧,先大致定位到那个大的for循环的地方然后你看ida中 那个for循环之后的if分支也调用了encrypt函数在for循环结束的地方下个断点,然后单步进入 call 00401500直接给他dump出来就是了encrypt函数了:这个就是那个encrypt函数了:直接拖入ida32中:这个start函数就是之前的encrypt函数了:然后修改一下参数的类型和名称,便于写脚本分析:然后看看str_a和aHahahahaDoYouF[i]中的数据:直接上脚本:发现并没有完全输出flag,这个jocker还没完呢,回ida中继续看看:看看字符串:这里应该就是程序的最后了:是这样的一个函数上脚本跑一下就出来了:
第三道是个Android题目[网鼎杯 2020 青龙组]bang安装到我的nexus5线刷的 android6.0上:是这样的然后看看有没有壳子:有壳,我选择用frida——tools脱壳:先挂起frida:端口转发:挂起:在输出的目录中找到dex文件 拖入jax中看看发现flag
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)