AliCTF2014题目解析之<reverse-300>

reverse-300

3.jpg


工具:IDA pro、WinDbg、UPX、Resource Hacker


先运行程序看效果



点击按钮直接崩溃,同时由于程序放到32位的xp虚拟机中不能运行,判断是64位程序。
根据提示程序本身就是有问题的,所以直接上IDA pro,发现是用UPX加了壳的:



使用UPX脱壳看看



成功!运行Ch3_d.exe看看效果



这效果。。。直接不能运行了,脱壳之前还可以弹出窗口来着!再从新脱一次壳,还这样,好吧,it's a trap!
用windbg分析一下崩溃的原因:把windbg注册为及时调试器,再运行Ch3_d.exe



崩溃的地址为
00000001`3fc81dcd 85c0 test eax,eax
IDA pro中视图导航到该地址,发现载入的基址不对(往下看就知道原因了),在windbg中用LM命令看一下模块情况

基址为13fc80000,在IDA pro中rebase后,查看崩溃点


*
和windbg中看到的情况一致,调用_initterm_e函数后就崩溃了,崩溃指令位于_initterm_e:
call rcx ;rcx=0x140001f2c
到这里我困惑好久(唉,菜啊),分析过程如下:
搜索一下 initterm函数,功能大体是执行给定的函数,call rcx出错,估计rcx的值应该就是Ch3_d.exe传递给initterm的参数了,是个函数地址,因此在IDA中搜索2c 1f 00,确实找到了0x140001f2c,0x140000000是64程序的默认加载地址,看来Ch3_d.exe还以为自己被加载到默认地址了呢。
分析到这里(还要分析才明白,一个字,菜!),就很明白了,是vista之后引入的随机基址的问题,依稀记得《0day安全》那本书上讲了相关内容(13章,ASLR),看了一眼,改下注册表就行了(这里就不写具体操作了,需要的可以自己去查,另:改PE头也可以避免这个问题)。


改完注册表,重启,运行程序,成功!激动地去点【Find The Key】,崩~~,windbg弹出来了,又崩溃了!什么情况?没办法,继续分析,看一下崩溃点附近的情况



加载DecryptDll.dll,导入RASDecrypt函数,DecryptDll.dll在哪?还能在哪,估计就在Ch3_d.exe的"肚子里了",用resource hacker看一眼



果然有个DLL,导出来重命名一下,再运行,我看你还崩!?
额,好吧,果断的。。。windbg又弹出来了,不费话了,看看什么情况,



崩在DecryptDll的RSADecrypt函数里了,用IDA加载DecryptDll看一眼(注意基址),



是崩在memcpy函数了,根据64位程序的调用约定,memcpy的三个参数依次为rcx(dst),rdx(src),r8(len),使用windbg跟踪到call memcpy



寄存器情况如图,rcx=0,rdx=21dc56,r8=15,可见是目的地址rcx的问题,在IDA中跟踪rcx,最跟踪到
DecryptDll!RSADecrypt的r8参数,r8应该是个有效的地址。
看一眼Ch3_d.exe调用DecryptDll!RSADecrypt时的参数情况



好吧r8=0,怪不得呢,看源码是故意用xor给清空了
那么只要在调用DecryptDll!RSADecrypt之前把r8改成一个可写的地址就行了,在该地址得到如下字符串



但是弹出的对话框中没有任何内容,但是看大神说这就是flag,就不继续分析了。


  1. k*&>(da30_q-(pkd23@,

最后总结一下“考点”吧(菜鸟观点):

  • UPX脱壳
  • 64位程序的调试
  • ASLR机制
  • 资源提取




原文地址:https://www.cnblogs.com/Wrong-Side/p/4334411.html