动态调试

通过本周的学习,对ida有了新的认识,除了查看代码外,还可以进行动态调试

查看系统

在查壳的时候要看一下程序是什么系统的程序,一般是windows的和linux的程序

windows

如果是windows的程序那么直接就在本地的主机进行动态调试就可以了

image-20231125185436891

linux

如果遇到了linux系统的程序,比如kali或者乌邦图的程序,就比较麻烦,需要进行虚拟机远程调试,下面会详细描述一下遇到的一些问题

easy_Maze(linux)

linux系统的程序,则比较复杂需要在linux系统的虚拟机里面进行远程调试

image-20231125185456210

拷贝linux_server到kali中

由于需要虚拟机进行远程调试,所以需要把ida安装包下的一些文件转移到linux的虚拟机里面

就是linux_server和64位的程序拖动到虚拟机里面

先搜索一下image-20231125185519972

image-20231125185526656

建议在虚拟机里面新建一个ida的文件夹存放这两个文件,之后进行建立远程链接的时候要用

image-20231125185537657

然后把需要调试的程序也拖动到这个文件夹下

image-20231125185548577

动态调试

然后把linux虚拟机里面的程序拖动到windows的ida中并反编译然后选择选择remote linux

image-20231125185559591

然后弹出一个提示框,这个是提示有可能是恶意代码的,一般的题肯定不会有恶意代码的,所以直接跳过就行了image-20231125185743239

然后弹出一个对话框

image-20231125185755354

区域1表示改程序在虚拟机中的路径名,如果是在虚拟机直接拖到ida中的话在这里就直接是默认的就可以

区域2表示该文件所在的文件夹的路径,同上拖动的默认即可

区域三要填虚拟机的id地址,不填应该也可以

在kali中使用ifconfig查看IP地址

如何查看linux虚拟机的IP地址:

使用ifconfig命令

首先虚拟机一般是没有插件的,所以需要下载和ip地址有关的插件

安装ifconfig工具包

首先在linux虚拟机中打开命令行,进入root模式后,然后输入命令apt-get -y install net-tools安装工具

image-20231125185810280

进入root

进入root模式的命令是su root ,如果进入不去的话,那可以尝试重新设置一个password然后使用新的password进入root

出现这样的提示就是安装完成了,就可以进行ifconfig了

image-20231125185821014

config一下看到ip地址

image-20231125185838675

image-20231125185844497

image-20231125185851760

这说明VWware的网卡连接模式为桥接

image-20231125185909641

然后改成仅主机模式就可以有ip地址

但是一般虚拟机与主机都是可以相互连通的,所以正常默认情况如果行不通可以用用这个IP地址找主机的方法

开启kali端的服务器连接

然后解决了这些东西之后,如果点击ok的话会发现并不成功,会提示目标计算机拒绝

image-20231125185922921

这时候我们就需要动用一下之前拷贝过去的linux_server了

在kali里面运行64位的程序image-20231125185933792

出现Listening on 0.0.0.0:23946…就是执行成功了

然后在重复上面的步骤进行远程调试

分析程序,在ste函数设置断点然后开始调试image-20231125190102337

之后我们就进入了调试界面,因为要看迷宫的具体参数,所以可以查看一下在断点处v5的数值

image-20231125190118712

通过分析函数可以分析出这个迷宫是一个7*7的,所以可以直接按照顺序换行得到1迷宫的地图

image-20231125190129611

再然后在kali里面先给迷宫程序设置权限级别,然后wasd控制迷宫移动即可

得到flag

image-20231125190141165

fmf_my_reverse(windows)

查壳

通过查壳这个是一个windows系统的程序,直接可以本地进行调试

image-20231125190152632

反编译

用32位的ida反编译出来image-20231125190214079

会发现有这么几串代码阻止了程序的调试,我们可以先执行程序到输入语句然后在ida中添加进程调试以此来跳过这几行代码

启动本机程序

类似于linux的server,在ida文件夹的根目录D:\Reverse\fby\IDA_Pro_7.7_Portable\IDA_Pro_7.7_Portable\dbgsrv

找到win32_remote.exe程序image-20231125190249758

然后设置断点

设在if语句 if ( !strcmp(v4, v6) )可以直观看到数值

image-20231125190302022

主机运行程序

由于我们要跳过那三行阻止动调的代码,所以就现在主机运行程序然后在动调的时候选择编译正在运行的进程

image-20231125190311609

然后在ida中选择remote windows

再然后选择debugger菜单下的attach to process调试已运行进程

image-20231125190323682

选择进程调试

点击后出现选择进程的对话框,选择执行的程序进程即可image-20231125190333854

跳过scanf

之后就到了调试界面,此时已经因为没有输入所以停在了scanf语句image-20231125190345064

然后再在程序中随便输入使程序继续运行,直到断点

image-20231125190355647

更新ida的进程运行

返回ida中,按f9或者单击绿色的三角形image-20231125190410585

然后就得到了运行到断点的程序,并且查看数值得到flagimage-20231125190422082

动调rc4–lazyida的使用

拖动到die中查壳,无壳,32位

img

反编译

img

分析函数

观察函数,上面有一整个v7数组,存储着数据

然后分析函数,有一个加密算法,但是函数有点复杂

所以我们可以暂时想想别的方法

运行一下程序

img

看到代码在中间停止了,并且还有输出语句

可以判定为,卡在了输入语句所以可以尝试动态调试来验证一下是否是加密解密共用一个代码

动态调试

利用动态调试验证解密与加密过程一致

首先先打开remot的exe文件,这里打开32位

img

然后可以注意到该代码有反动调的代码,所以只能使用已有的程序先执行跳过反调试代码再进行调试

先运行代码,然后打开ida

img

设置一下断点

img

然后开始调试

正调试

调试成功,程序在断点处停止了

img

然后再继续运行代码,使代码在输入语句处停止,然后输入44个字母,便于观察一下

img

img

可以看到a已经存储在里面了

img

然后记录下内存地址,返回代码页面

然后按f8单执行一部,使数据进行加密

再然后搜索一下原来的内存地址,查看加密之后的数据

按g键

可以看到数据已经被修改了

img

img

选中数据

右击转化成字符串

img

得到结果为

F60DC6D7B7046F0E890DFD835924E8A599C4C8F92B127FB928E05BA06E336AE4B7FA5542F08D11E578E39BD6

输入:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

内存地址:00B3F464

结果

所以接下来,就输入结果然后看得到的结果是否是AA

逆调试

但是,由于程序界面输入的只有字符,有些字符是不可见字符,也无法输入,所以就要利用lazyIDA插件的内存修改功能,先随便输入,然后把输入的内容修改成那一串十六进制代码

重新开一下动调

这一次输入都先输入1然后再修改

img

、右击–laste data,然后打开窗口

输入要替换的数据

img

然后再看,会发现修改成功了

img

再摁f8开始加密过程

img

由此证明,这个rc4和异或是一样的,可以用相同的手法将结果重新进行计算得到答案

正题解密

还是先正常绕过反调试代码

然后随便输入44个字符,然后进行提取数据

提取数据

首先现将本题v7数组

双击v7,找到v7字符的首个字符

img

然后要进行选取四个四个数有点难,可以复制内存然后打开进制转化器,然后把16进制转化成10进制,然后再加44,再变回十六进制

img

加44后是12832000

img

然后一样的方法,转化成字符得到

E415C4EDA62F5610BB13EBAD7556C7BBBBE9B9CC023A509F369069BE7C4244CAC6D4245CD2B9

img

替换内存数据

再然后使用内存替换功能替换成程序中的数据

img

img

解密

然后按f8转跳一步进行加密

img

按照常理来说,此时的str字符串,就是最终的flag

查看一下,得到了flag

img

得到flag