从逆向到反日

请注意,本文编写于 1911 天前,最后修改于 999 天前,其中某些信息可能已经过时。

起因

在隔壁院的新生群里玩耍,正好听说有个专用程序,同时还有一天就开学了(其实是因为要补考,我实在复习不进去那什么中国音乐史,外国音乐史

2063193114.jpg
2063193114.jpg

起因2.jpg
起因2.jpg

到手.jpg
到手.jpg

很好,程序到手,分析一波

走起

界面.jpg
界面.jpg

界面2.jpg
界面2.jpg

预计在MSGBOX那里有网络通信,随手输入几个数字,让我们看看到底是咋样通信的。
然后开启wireshark分析一波流量
流量.jpg
流量.jpg

WTF??我看到了什么?这熟悉的语法。然而在流量中没有看到详细的连接请求,也就是账户密码等信息,所以先拿Nmap扫一波
sql server.jpg
sql server.jpg

确定是sqlserver,好,IDA PAO,启动!不对,在此之前,PEiD康康是什么壳
壳.jpg
壳.jpg

发现是个ASP壳,emmm,直接ESP定律找OEP dump出来就行,甚至直接用脱壳机都可以。不管怎么样壳是脱了
脱壳.jpg
脱壳.jpg

Delphi程序欸。现在有点少见了呢,其实我还以为是个MFC程序呢(
然而发现启动失败了
启动失败.jpg
启动失败.jpg

⑨BIE发现事态有那么一丝不对劲.jpg
不管了,继续,能出现界面至少说明PE格式没有破坏。
拉到IDA看看逻辑
emmmmm.jpg
emmmmm.jpg

emmmmm??
几K个函数,分析不动。。看了半天晕了_(:з)∠)_。。不管了,先直接找字符串试试,输入对象IP
字符串.jpg
字符串.jpg

嘿找到了。
双击,X查找引用
call.jpg
call.jpg

发现作为参数压入了个奇怪的函数,这莫非就是连接函数?
wtf.jpg
wtf.jpg

wtf??
倒回去看了下,一个0-9A-Z的表,一个mov eax, unkonwn_address;push word ptr [eax +4]操作,再配合之前的脱壳后无法启动,这尼玛八成。啊不,九成九是加了混淆啊喂魂断。(╯‵□′)╯︵┻━┻
没办法,想了一下,程序连接sqlserver有什么方式呢?特别是这种古老的delphi。
试着搜索关键词User id=
数据库字符串.jpg
数据库字符串.jpg

果不其然,收到了,继续X查看引用
sqllink.jpg
sqllink.jpg

sqllink2.jpg
sqllink2.jpg

我们重点分析右下角的call sub_4052AC。跟进
堆栈不平衡.jpg
堆栈不平衡.jpg

发现堆栈不平衡,可以知道,这基本也是混淆的问题了。但是,我们猜测,这应该是一个字符串拼接的地方,最后拼接出来的,肯定是一个带有账户密码的内存条件。
虽然二进制程序内加密了,不过不管了,我们已经大致知道程序运行流程了。就和ESP定律一样,无论你程序怎么编码,最后都是要出现在内存中的。
我们直接找原版无壳的丢到OD中去分析。
因为知道会创建窗口,所以我们用API断点,设置一个CreateWindowsA的断点
断点.jpg
断点.jpg

走起,然后在断点处,用中文ASCII搜索功能搜索主线程字符串password
ascii.jpg
ascii.jpg

然后flow进去,在这个地方,右键,断点,内存访问
断点2.jpg
断点2.jpg

这样有啥程序调用我们这个,我们就都知道啦。
然后把之前的CreateWindows的断点清除,留下这个内存访问的断点,然后ctrl+F2重新开始程序。跟踪步入,GO。走起。

等下,走起之前,突然想起,这步入执行很慢的,走到那里要后年马月,根据IDA PRO的分析,我们知道,连接过程是在窗口启动之后才进行的,所以我们把断点设置到UpdateWindow,上,在那之后运行跟踪步入

find.jpg
find.jpg

成功找到,接下来,我们就F7单步执行,康康到底都写着啥,最后,在手都快按酸的情况下,终于找到了
找到啦.jpg
找到啦.jpg

好,现在账号密码都有了,然而,我突然发现,这密码这一块,有三个框框,对应HEX是1E 1F 1A,起初以为是SQL SERVER的自定义颜色,我把1F1A3B输入进去,连接。发现错误。然后感觉call名称MutibyteToWideChar,以为是宽字节的字符串编码,这下让我为难了,这sql server怎么输入宽字符啊,用%号x之后,都不对,一气之下,直接复制黏贴进去。欸,成了
连上.jpg
连上.jpg

惯例,测试xps_cmdshell。发现连接失败,直接超时了。
不是报错?那么就有几个原因

  1. 没开xps_shell =》 不太可能,毕竟没报错
  2. 没有权限 =》不太可能 原因如上
  3. 杀软或者其他奇怪设置拦截 =》 八成是这个

那么怎么办呢?这时候可以使用

declare @shell int 
exec sp_oacreate 'wscript.shell',@shell output 
exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\log.txt'

然后再用

create table tmp_text (lines nvarchar(1000))
bulk insert tmp_text from N'C:\log.txt'
select * from tmp_text 
drop table tmp_text 

读取。首先我们先看看权限

whoami.jpg
whoami.jpg

system.jpg
system.jpg

emmmm,system可还行,直接新建一个用户,OK成功连上。
拿下.jpg
拿下.jpg

结束

总共前前后后下来,花了三个小时吧,之前不知道,分析过后才知道,自己动态调试技术实在太差了。

其实花的时间都浪费在了识别协议,解读程序流程(这段花了最多,我一直天真的以为我可以不靠调试器脑力解码2333),以及动态调试。

一趟下来,其实也挺好玩的。接下来的时间得多看看动态调试相关的书了emmm。

溜了溜了,得补考音乐史去了。哇的一声哭出来。

添加新评论

已有 5 条评论

我也学过破解,不过没成,并且也忘光了。你厉害

牛皮呀

太强辣!(「・ω・)「