Crackme(持续更新当前进度3:160_又想打CTF坐牢了)
Acid burn(本地登录器)
静态分析
32位,无壳,Delphi程序。
运行后输入账号:aaaa密码:aaaa,弹出错误弹窗。
思路清晰直接IDA,找”Sorry,The serial is incorrect!”字符串。
动态调试
在字符串的上方处找push ebp代码段开始下断点,重新执行发现代码段停在了断点处。
经过动态调试后,确定函数功能,第一处if判断字符串长度<4跳出。第二处if判断注册机生产的密码和输入的密码是否一致。
代码实现
1 | #define _CRT_SECURE_NO_WARNINGS 1 |
复盘
按钮功能调用类似于调用指针数组方式,不好直接静态找函数地址;如果不能直接找到特征,可以OD,XDBG抓堆栈调用看有没有明显的压参数或者Call函数调用,通过Call函数调用可以找到上一级的函数调用,压一些动态解密的参数也可以进行函数功能的判断;
sprintf()函数可以用于字符串拼接,int到字符串或者其他格式进行转换;
Windows平台下itoa()函数可以用于将int字符串转换为Ascii字符串格式。
Afkayas.1
参考:
https://www.52pojie.cn/thread-1617093-1-1.html (直接分析)
https://github.com/fjqisba/VB-Helper (IDA7.5分析VB程序插件)
https://www.cnblogs.com/bbdxf/p/3793545.html (VB常见函数功能)
https://bbs.kanxue.com/thread-12133.htm (VB指针结构体&&GUITABLE)
静态分析
32位,VB5.0程序,不使用IDA插件不能直接对程序进行分析。
用户名:aaa密码:bbb。
进入后抓对应字符串,在函数段的开始位置下断点,并且再次执行后断下了,确定代码段位置。
动态分析
输入的账号获取长度后,字符串长度*0x17CFB+字符串的首位字母获取一个值,当前情况是292690.
固定的字符串”AKA-“和根据账号长度获取的特征值进行拼接,与输入的bbb密码进行_vbaStrCmp比较,确定是否进行跳转弹出结果。
输入账号对应的密钥后,结果正确。
代码实现
1 |
复盘
VB程序的字符出查询或者智能搜索字符串需要在程序没有进入VB结构体时进行查找分析,在进入结构体后执行逻辑会动态加载大量的无关的字符串包括换行符号,系统DLL的路径,程序路径,并且会找不到一些硬编码的字符串;
VB程序入口点会压入一个指针,这个指针指向了VB程序的结构体,56 42 35 21是VB5.0程序的特征,类似于PE文件结构PEHEADER,存在一些结构体对象,主要就是4C偏移位置的一个GUITABLE;
00401660是GUITABLE的位置,在VB5特征的正上方位置有一个0x40大小的结构,主要涉及VB程序的弹窗功能。