攻防世界逆向入门题之csaw2013reversing2
继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向入门题的csaw2013reversing2
首先把下载的附件扔如exeinfope中查看信息:
win32无壳,那么既然是windows的直接双击运行一下看看:
弹了个框,结合题目所说的:
听说运行就能拿到Flag,不过菜鸡运行的结果不知道为什么是乱码
那么这个就是乱码的flag了,乱码有好多种,base64加密等等这些,我们一个个排除,先扔入IDA中查看伪代码。要先看C或C++伪代码再分析反汇编结构图最后才看反汇编文本!!!!
我吃了很多亏在这里,总是以为能直接看懂汇编,的确能看懂,但是无法掌握汇编的结构流程,所以照着上面步骤来就会好很多。
main主函数伪代码如图:
首先扔开系统函数,系统函数大部分都不是解题关键,
MessageBoxA(0, lpMem + 1, "Flag", 2u);
HeapFree(hHeap, 0, lpMem);
HeapDestroy(hHeap);
ExitProcess(0);
这些都是系统函数,那么解题关键就在前面了:
memcpy_s(lpMem, MaxCount, &unk_409B10, MaxCount);//这个是复制函数,把&unk_409B10处的字符串赋值给lpMem,分析后可知这是乱码的flag,双击跟踪&unk_409B10也可以看到是弹框中输出的乱码。
if ( sub_40102A() || IsDebuggerPresent() ) //这是判断函数,如果判断是调试器运行就执行这个解密
{
__debugbreak();
sub_401000(v3 + 4, lpMem);//这个双击跟踪进去后发现是一个运算函数,那么只能是解密算法所在了
ExitProcess(0xFFFFFFFF); //解密后就退出了,就没有后面的弹框了,需要我们自己想办法。
}
分析完了,我们开始解题,也是好几种方法:
1:静态调试:根据sub_401000的解密算法自己仿照C语言或python脚本解密,因为参数都可以跟踪到。
2:动态调试:在onllydbg中进入解密流程内,解密后查看寄存器或跳转到messageboxA中进行弹出即可。
这里我用的动态调试:
按照流程看完C语言伪代码后我们来看反汇编结构图:
有了前面分析基础就看懂得多了:loc_4010B9:是弹框函数所在,loc_401096:是解密函数所在,最左边那个应该是冗余代码,loc_4010EF和loc_4010CD: 都是退出函数所在。
注意这里loc_401096有个int 3;这是断点的一种,代码执行到此次会抛出异常然后强制退出,所以我们在动态调试中要改为nop。
接下来看反汇编文本:
可以发现大同小异,照着反汇编结构图来跳转划分即可。
那么我们上onllydbg:
可以看到我改了几个地方:
1:
002B1094的 jz short loc_4010B9改成jnz short loc_4010B9,虽然我也不知道为什么我用onllydbg调试还是进不去解密函数,可能onllydbg被认为不是调试器吧。
2:
002B109A 的int 3;断点强制退出被我改成了002B109A nop,标识空操作,避免退出。
3:
002B10A3的 jmp 0453d212.002B10EF改成jmp 0453d212.002B10B9 因为这里别来解完密后就退出的,我把它转到原来loc_4010B9:的messageboxA函数去作为弹框内容输出了。(ps:我本来是跳转到最IDA反汇编结构图的左边那个冗余函数的,因为我看它也是MessageboxA函数,结果弹出个空框,对比后才发现它比第二个MessageboxA少了几行代码,原来是个坑,难怪。)
到这里就弹出flag了:
总结:
1:
要先看C或C++伪代码再分析反汇编结构图最后才看反汇编文本!!!!
我吃了很多亏在这里,总是以为能直接看懂汇编,的确能看懂,但是无法掌握汇编的结构!2:
首先扔开系统函数,系统函数大部分都不是解题关键,
解毕!敬礼!