一.梅津美治郎
1.查壳:无壳,32位。
2.IDA反编译。
直接shift+f12查看字符串
找到“You passed level1!”(有信息:flag不止一部分。),跟进。得到第一部分flag:r0b0RUlez!
查看sub_4015EA函数,这里应该有第二部分flag。
emmmmm,关键应该在 __debugbreak,但是静态调试无法实现。直接动调
这儿有个int 3断点,不太了解这个int 3,问了一下大佬:
这里有个debugbreak函数,这函数的话,也就是相当于一个int 3指令,引发一个中断,把执行权移交给调试器,如果没有调试器,那就移交给其他异常处理回调函数,如果都没有,那么程序就自己断下来,这里就是为了触发回调函数,如果没有调试器附加,那么debugbreak产生的异常会被AddVectoredExceptionHandler添加的回调函数捕获来处理。
这就需要回看main函数了
通过动调得到v3=kernel32.dll:有中断处理
这就可以和 __debugbreak连接起来了,分析代码可知sub_40157F为第二处flag,跟进。
逻辑就是一个简单的对2异或 :点击dword_40AD98可得到字符串
3.exp
4. get flag
flag{r0b0RUlez!_w3lld0ne}
二.76号
1.查壳:无壳,32位。
2.IDA反编译。
把 jmp short near ptr loc_804843A+1 nop掉。p键定义函数
进入main函数
关键在sub_8068580
逻辑:从开始看可之a2为flag的下标v3为flag只需要根据a2的值对应就行。需要注意的是flag的位数看每个case的return只有k对应return是返回1.所以flag末尾是k,再根据k处的代码a2=12可知flag有13位。
3.get flag
flag{09vdf7wefijbk}