首页 > 其他 > 详细

csaw2013reversing2 writeup

时间:2020-07-18 18:15:42      阅读:40      评论:0      收藏:0      [点我收藏+]

csaw2013reversing2 writeup

1、程序分析

技术分享图片

题目是一个exe文件,提示运行即可拿到flag,但是窗口弹出之后会出现一堆乱码。这时候,我们把文件丢入IDA之中,看到程序大致流程如下。

技术分享图片

 主函数如图所示,流程比较简单,进入sub_40100看一下,我们看到sub_40100函数是一个加密函数。

技术分享图片

还有一个函数sub_40102A如图所示:

技术分享图片

2、IsDebuggerPresent函数与int 3中断

 进入函数的时候,会有一个判断,sub_401020函数和IsDebuggerPresent函数返回值有一个不为零的时候,就会执行sub_401000函数,否则,就会跳过函数,直接执行后面的窗口函数。

分析程序,我们看到sub_401020的返回值恒为0。关于IsDebuggerPresent函数,文档上给出说明如下:

 技术分享图片

 

 就是说,如果程序在调试状态下运行的话,返回值不为0,如果不在调试状态下运行,返回值就为0。程序运行时,他的返回值一定是0,所以程序直接执行了后面的窗口函数而没有执行加密函数。

在OD中打开程序,我们会看到一个指令:int 3。int 3是一个调试中断,这条指令可以使CPU中断到调试器。

2、修改指令

到这里,我们应该明白,要不显示乱码,就要改写程序数据流走向,让程序执行sub_401000这个加密函数。一开始可能会想直接改写sub_40102A的返回值,但是这个是有问题的,汇编代码eax清零的时候,会用xor eax,eax,这条指令只占用2个字节,但是mov eax,1的话,要占用5个字节。

技术分享图片

所以,我们应该控制的,是几条跳转指令:

1、是if判断结束后的那一条跳转指令,我们让程序执行跳转函数,将jz short 002710EF改写为jmp short 00271096;

2、执行完加密函数之后,我们去执行窗口函数,jmp short 002710EF修改为jmp short 002710B9。

技术分享图片

 

执行,就可以得到flag。

 

csaw2013reversing2 writeup

原文:https://www.cnblogs.com/L0g4n-blog/p/13331114.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!