学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

1375

积分

4

好友

24

主题
发表于 2020-9-17 14:05:02 | 查看: 4709| 回复: 0
初步分析  题目链接
https://wws.lanzous.com/i6Zo2gpbolc
  2020HWS选拔赛的IOT逆向题目,内有3个文件

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  其中readme.txt内容如下:
  题目运行命令如下:
  sudo qemu-system-mipsel -M malta -hda openwrt-malta-le-root.ext4 -kernel openwrt-malta-le-vmlinux.elf -nographic -append "root=/dev/sda console=tty50"
  需要分析的程序为 ./bin/maze
  .ext4格式文件能直接解压缩,复制出/bin/maze,用file看一下文件格式

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  发现是小端mips,根据readme.txt的内容能直接模拟整个openwrt系统来运行,而且可以使用gdb调试,但是调试过程中遇到了很多问题,比如莫名其妙突然不能显示输入输出的字符等
  因此考虑使用静态分析方式,那么有以下几个工具可以选择
  •   Ghidra
  •   IDA7.5
  •   JEB-MIPS

  首先推荐IDA7.5,氪金才能变强,如果想白嫖最好还是选择JEB-MIPS
  根据个人经验,JEB-MIPS的伪代码效果要优于Ghidra,在一些异或处理上Ghidra显示的伪代码会和汇编有歧义,使用者容易被误导
  个人使用的JEB版本可在如下链接获取
  [Android Tools] JEB 3.17.1 Anti-Covid19 Edition by DimitarSerg
  https://www.52pojie.cn/thread-1162477-1-1.html
静态分析  根据题目maze也可以知道,这是一个CTF逆向题中典型的迷宫题
  sub_400B44为主函数
  首先限制了输入长度为32

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  其次在sub_4006F0()通过预置的字符串"AMz1nG~#--Ma7e~"得出迷宫布局,即.bss段中的maze数组

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  根据字符串的长度和循环次数可以判断出迷宫大小为8*15
  我们可以根据伪代码还原出迷宫生成函数,从而打印出迷宫

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  剩下的就是判断,上下左右分别用UDLR代替,下图中以ASCII码显示

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  根据v1=1,v2=0可以判断起始点是(1,0),而要走32步,则只有如下图路径

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析

结果为
  DDRDDLDDRRRRRDRDDDDDLLDDLLLUUULU
动态分析  那么如果迷宫生成步骤再复杂一点,很难从伪代码分析还原出迷宫,就需要动态调试了。
  而根据前文所述,无法使用openwrt自带的gdb调试,那么通过外接gdb是否可以呢
  已知使用qemu可以直接模拟执行静态编译的程序,但是如何对题中这种动态编译,需要外部依赖的程序进行模拟执行呢?
  经过查阅资料(https://www.colabug.com/2020/0824/7658729/),参考博主大佬对embedded_heap的调试过程,使用命令如下
  qemu-mipsel -L ./ ./bin/maze

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  注意,根据博主大佬的过程,需要参照lib文件夹中的两个1kb文件内容,修改对应的so文件,不然会出现解析错误

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  解释的可能不是很清楚,直接举例吧,比如ld-musl-mipsel-sf.so.1其实并不是一个ELF格式的程序,用txt打开之后里面只有libc.so,因此删除旧的ld-musl-mipsel-sf.so.1并将libc.so命名为新的ld-musl-mipsel-sf.so.1

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  对libatomic.so.1的处理过程也一样,处理之后就可以愉快的动态调试了
  因为要使用gdb调试,所以使用-g参数设置端口
  qemu-mipsel -g 1234 -L ./ ./bin/maze
  之后安装apt-get install gdb-multiarch,再使用如下命令启动gdb
  gdb-multiarch -q ./bin/maze
  设置架构和大小端序(默认小端)
  set architecture mips
  set endian little(本题为小端,可以不使用此命令)
  最后远程连接调试端口,如在本地127.0.0.1可以省略不写
  target remote :1234
  本以为这样就结束了,可以愉快下断点了,但是下完断点执行gdb就崩了,换用pwngdb也是如此,过程如下图

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  问题暂时无解,希望知道原因的师傅能告诉我
  因此选择使用IDA调试,虽然7.5以下的IDA不支持显示mips的伪代码,但是远程调试还是妥妥的,依旧是使用qemu-mipsel -g 1234 -L ./ ./bin/maze启动远程调试,ifconfig看一下虚拟机的ip,使用IDA打开maze文件,下断点后选择Remote GDB debugger运行

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析

填写虚拟机ip和端口,其它参数默认点OK即可

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  如果断点下在了初始化迷宫布局结束之后,例如sub_400904处,运行至此处后找到.bss段的maze变量转化为数组即可看到迷宫全貌

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析

此处还有一个坑点,使用IDA7.0的时候同样的流程看不到.bss段初始化后的结果,全是?
  而换用7.2就可以了,泪目,果然氪金才能变强
  不过论坛有7.2的版本,下载一个就OK
  剩下的见静态调试分析

记一次MIPS题目的逆向分析

记一次MIPS题目的逆向分析
  最后,求知道为什么gdb调试会崩掉的师傅解惑






温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-4-26 04:44 , Processed in 0.088818 second(s), 40 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表