初次接触动态调试--lazyida初次使用
动态调试
通过本周的学习,对ida有了新的认识,除了查看代码外,还可以进行动态调试
查看系统
在查壳的时候要看一下程序是什么系统的程序,一般是windows的和linux的程序
windows
如果是windows的程序那么直接就在本地的主机进行动态调试就可以了
linux
如果遇到了linux系统的程序,比如kali或者乌邦图的程序,就比较麻烦,需要进行虚拟机远程调试,下面会详细描述一下遇到的一些问题
easy_Maze(linux)
linux系统的程序,则比较复杂需要在linux系统的虚拟机里面进行远程调试
拷贝linux_server到kali中
由于需要虚拟机进行远程调试,所以需要把ida安装包下的一些文件转移到linux的虚拟机里面
就是linux_server和64位的程序拖动到虚拟机里面
先搜索一下
建议在虚拟机里面新建一个ida的文件夹存放这两个文件,之后进行建立远程链接的时候要用
然后把需要调试的程序也拖动到这个文件夹下
动态调试
然后把linux虚拟机里面的程序拖动到windows的ida中并反编译然后选择选择remote linux
然后弹出一个提示框,这个是提示有可能是恶意代码的,一般的题肯定不会有恶意代码的,所以直接跳过就行了
然后弹出一个对话框
区域1表示改程序在虚拟机中的路径名,如果是在虚拟机直接拖到ida中的话在这里就直接是默认的就可以
区域2表示该文件所在的文件夹的路径,同上拖动的默认即可
区域三要填虚拟机的id地址,不填应该也可以
在kali中使用ifconfig查看IP地址
如何查看linux虚拟机的IP地址:
使用ifconfig命令
首先虚拟机一般是没有插件的,所以需要下载和ip地址有关的插件
安装ifconfig工具包
首先在linux虚拟机中打开命令行,进入root模式后,然后输入命令apt-get -y install net-tools安装工具
进入root
进入root模式的命令是su root ,如果进入不去的话,那可以尝试重新设置一个password然后使用新的password进入root
出现这样的提示就是安装完成了,就可以进行ifconfig了
config一下看到ip地址
这说明VWware的网卡连接模式为桥接
然后改成仅主机模式就可以有ip地址
但是一般虚拟机与主机都是可以相互连通的,所以正常默认情况如果行不通可以用用这个IP地址找主机的方法
开启kali端的服务器连接
然后解决了这些东西之后,如果点击ok的话会发现并不成功,会提示目标计算机拒绝
这时候我们就需要动用一下之前拷贝过去的linux_server了
在kali里面运行64位的程序
出现Listening on 0.0.0.0:23946…就是执行成功了
然后在重复上面的步骤进行远程调试
分析程序,在ste函数设置断点然后开始调试
之后我们就进入了调试界面,因为要看迷宫的具体参数,所以可以查看一下在断点处v5的数值
通过分析函数可以分析出这个迷宫是一个7*7的,所以可以直接按照顺序换行得到1迷宫的地图
再然后在kali里面先给迷宫程序设置权限级别,然后wasd控制迷宫移动即可
得到flag
fmf_my_reverse(windows)
查壳
通过查壳这个是一个windows系统的程序,直接可以本地进行调试
反编译
用32位的ida反编译出来
会发现有这么几串代码阻止了程序的调试,我们可以先执行程序到输入语句然后在ida中添加进程调试以此来跳过这几行代码
启动本机程序
类似于linux的server,在ida文件夹的根目录D:\Reverse\fby\IDA_Pro_7.7_Portable\IDA_Pro_7.7_Portable\dbgsrv
找到win32_remote.exe程序
然后设置断点
设在if语句 if ( !strcmp(v4, v6) )可以直观看到数值
主机运行程序
由于我们要跳过那三行阻止动调的代码,所以就现在主机运行程序然后在动调的时候选择编译正在运行的进程
然后在ida中选择remote windows
再然后选择debugger菜单下的attach to process调试已运行进程
选择进程调试
点击后出现选择进程的对话框,选择执行的程序进程即可
跳过scanf
之后就到了调试界面,此时已经因为没有输入所以停在了scanf语句
然后再在程序中随便输入使程序继续运行,直到断点
更新ida的进程运行
返回ida中,按f9或者单击绿色的三角形
然后就得到了运行到断点的程序,并且查看数值得到flag
动调rc4–lazyida的使用
拖动到die中查壳,无壳,32位
反编译
分析函数
观察函数,上面有一整个v7数组,存储着数据
然后分析函数,有一个加密算法,但是函数有点复杂
所以我们可以暂时想想别的方法
运行一下程序
看到代码在中间停止了,并且还有输出语句
可以判定为,卡在了输入语句所以可以尝试动态调试来验证一下是否是加密解密共用一个代码
动态调试
利用动态调试验证解密与加密过程一致
首先先打开remot的exe文件,这里打开32位
然后可以注意到该代码有反动调的代码,所以只能使用已有的程序先执行跳过反调试代码再进行调试
先运行代码,然后打开ida
设置一下断点
然后开始调试
正调试
调试成功,程序在断点处停止了
然后再继续运行代码,使代码在输入语句处停止,然后输入44个字母,便于观察一下
可以看到a已经存储在里面了
然后记录下内存地址,返回代码页面
然后按f8单执行一部,使数据进行加密
再然后搜索一下原来的内存地址,查看加密之后的数据
按g键
可以看到数据已经被修改了
选中数据
右击转化成字符串
得到结果为
F60DC6D7B7046F0E890DFD835924E8A599C4C8F92B127FB928E05BA06E336AE4B7FA5542F08D11E578E39BD6
输入:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
内存地址:00B3F464
结果
所以接下来,就输入结果然后看得到的结果是否是AA
逆调试
但是,由于程序界面输入的只有字符,有些字符是不可见字符,也无法输入,所以就要利用lazyIDA插件的内存修改功能,先随便输入,然后把输入的内容修改成那一串十六进制代码
重新开一下动调
这一次输入都先输入1然后再修改
、右击–laste data,然后打开窗口
输入要替换的数据
然后再看,会发现修改成功了
再摁f8开始加密过程
由此证明,这个rc4和异或是一样的,可以用相同的手法将结果重新进行计算得到答案
正题解密
还是先正常绕过反调试代码
然后随便输入44个字符,然后进行提取数据
提取数据
首先现将本题v7数组
双击v7,找到v7字符的首个字符
然后要进行选取四个四个数有点难,可以复制内存然后打开进制转化器,然后把16进制转化成10进制,然后再加44,再变回十六进制
加44后是12832000
然后一样的方法,转化成字符得到
E415C4EDA62F5610BB13EBAD7556C7BBBBE9B9CC023A509F369069BE7C4244CAC6D4245CD2B9
替换内存数据
再然后使用内存替换功能替换成程序中的数据
解密
然后按f8转跳一步进行加密
按照常理来说,此时的str字符串,就是最终的flag
查看一下,得到了flag
得到flag