布布转PC端逆向啦。加油加油!!!
今天在看滴水三期的x86汇编课程和吾爱ximo的脱壳教程。现在是边学变做题。。有着arm的基础。x86的汇编很容易接受,懂了点基础指令。开始尝试解题。今天做的题碰到的也是upx的壳。打开kali直接upx -d 就脱掉了。没啥意思,期待后面吧。
第一次用ida远程调试Linux 系统下的文件,刚开始遇到了坑,最后还是解决了。留个记号吧。
第一次学用gdb来调试程序。基本上对着教程来操作的。总之也留个记号吧。
相关教程:https://blog.csdn.net/horotororensu/article/details/82256832
热爱可抵岁月漫长
使用ida & gdb 调试 程序。
案例:攻防世界- RE - 新手入门 no-strings-attached
ida & gdb 调试
-
打开查壳软件Exeinfo
发现没有加壳。同时为ELF格式文件且为32位。
打开32位的ida将文件拖进去F5查看主函数
都是函数。分析可知,在authenticate()中出现了我们想要的flag痕迹。
跟进去查看伪代码.
发现有个加密函数decrypt(看名字看出来的)
估计是对传进来的函数进行了加密操作然后赋值给s2.
而下面就是对有关s2和输入对比的if判断。所以,s2就是我们想要得到的flag。而我们如何获得呢?我们可以进行动态调试获得。
ida调试 -
开启在Linux开启ida的调试服务。
将ida目录下dbgsrv文件夹里面的
移入Linux的目录中。打开一个来启动调试服务。
打开ida
选择
出现如图所示
然后
Application 选择linux系统中,你所要调试的文件的路径,
Directory 现在linux系统中,你所要调试的文件所在的目录路径
parameters 不用填,留空
Hostname 选择你linux的IP(下文给出怎么找到ip地址)
password 你linux的密码。
获取IP:打开linux终端。输入 ifconfig -a
填好上方后,如图。
点击OK
成功进入。
另外打开一个IDA直接加载该文件。来查看authenticate函数的位置。
重新切换回我们的动态调试的ida。按G 搜索0x08048708并跳转。设下断点。开始运行。
一直F8调试到08048725
一定要经过decrypt这个加密函数。然后起字符串都保存在了eax这个寄存器中。我们在HEX 中查看eax保存过的值。
这里就可能有人说上面不是还有一个1吗?应该是从1开始的,我们直接进eax跳转的地址看。
发现是从9开始。故。我们的flag为
9447{you_are_an_international_mystery}
成功用ida动态调试的方法解出。
gdb动态调试
我们现在来讲讲用gdb来动态调试。
打开kali,用gdb加载程序。
既然是动态调试,gdb也跟ida一样,也要下一个断点来进行调试。从上文IDA静态分析可知,经过decrypt加密后即为我们要的flag。故我们在decrypt这函数下断点 b为下断点
输入 r 开始运行程序,会运行到我们下断点的地方
然后n为单步步过,p为单步步入。
此处我们需要n。直接步过该函数,让函数直接执行完。
我们直接看保存在eax中的值。使用x命令(格式如下)
输入 x/200xw $eax (200是要查看的内存单元个数为200个,x是输出整数的格式为十六进制。w是4字节输出。)
在C语言中。0x00000000 为字符串结束符‘ ’。那么前面即为我们需要的flag的十六进制了。扣出来,写个脚本跑一下,或者直接复制到十六进制转文本的在线转换网页转换即可得到flag。