ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

一个非常简单的C程序的逆向

2021-04-13 15:54:43  阅读:136  来源: 互联网

标签:逆向 非常简单 sub 10 程序 40138C var ExitCode


文件名:ReverseMe01_By@XiaoMing.exe
大小:17,859字节
Md5:FD57FCD3A3DE6D14BF2E1614814C289C
下载:https://www.lanzous.com/i1rbaaj
作者:小茗(Q:954407878)
作者要求:
1、求出使程序退出的方法
2、求出程序ExitCode的基本计算方法


查壳

PEiD查壳
发现无壳、PEiD语言检测为FreeBasic


逆向

程序跑起,发现为一个Console程序,无回显。
按字母,无回显,按方向键,有如下回显:

Cols=[128] Lines=[32]

熟悉CMD的都知道这是Console缓冲区的每行字符数(类似宽)和行数(类似高)。
无进展,关闭程序。
拖入IDA,查看导入表
导入表
发现有大量C函数调用,可知程序是C程序。
找到刚才回显的的字符串,
字符串
还发现了2个可疑的字符串(疑似窗口大小设置的CMD命令),
查找回显字符串的Xref,定位到sub_40138C,
由于程序没有加壳,再按运行流程分析下,
入口如下:
入口
进入sub_4011E0,
逆向1
由Call __p__environ可知其上的代码为初始化代码
由最后四条指令可知sub_40138C执行完后就退出,且其返回的Eax最终作为ExitCode,
种种迹象表面sub_40138C为(对逆向来说有意义的)代码区域,
进入sub_40138C,按作者的要求来直接找ret/retn,很快找到
返回条件
可知返回条件为var_8>0x7E,且顺便发现了有关ExitCode的计算指令,
ExitCode的计算涉及到var_8、var_4,var_10
经过查找,修改var_10的只有这一处:
var_10
可知var_10为随机分配的内存地址,
修改var_4的有两处:
var_4_1
var_4_2
可知var_4为_getch函数的返回值,即用户按下的键值,
修改var_8的有两处,
var_8--
var_8++
分别对var_8进行减1和加1操作,顺便得知var_8为CMD的行数(Lines),
而var_8的初始值可以从最初打开程序按下小键盘上下左右的回显来得知,也可以从该sub的初始化处得知,为32。
var_8初始值
而我们的目的之一就是让var_8>0x7E,而var_8最初=0x20<0x7E,所以我们定位到让var_8加1的函数快,进而定位到loc_40143D,想进入使var_8加1的函数块,var_4必须等于0x91,查找键值表后发现为Ctrl+下键,
那么第一个问题解决了,方法就是按住Ctrl+下直到Lines>0x7E,程序退出。
第二个问题我们要回到涉及到退出的代码附近,
易得ExitCode=(var_8&var_4)+var_10,
因为要使程序退出,最后一个键按下的肯定是ctrl+下,可确定var_4的末值为0x91,
而因为对于var_8仅有+1和-1两种操作,固退出时var_8=0x7f,
所以
ExitCode=(var_8&var_4)+var_10=(0x7f&0x91)+随机分配的内存地址
即0x11+随机分配的内存地址。

标签:逆向,非常简单,sub,10,程序,40138C,var,ExitCode
来源: https://blog.51cto.com/oldliu/2703469

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有