UCTF 2016 ADD之Ghidra的安装及使用

一、下载Ghidra

1.官网链接

https://ghidra-sre.org/

2.百度网盘下载

https://pan.baidu.com/s/10shhtf05fy4Y2w6WYkuYng
提取码:oy1l 

UCTF 2016 ADD之Ghidra的安装及使用_第1张图片

二、解压到安装目录

UCTF 2016 ADD之Ghidra的安装及使用_第2张图片

三、安装Java Development Kit (JDK)略

四、运行ghidraRun.bat

初次运行要求JDK环境,将JDK安装目录输入进去,然后回车

UCTF 2016 ADD之Ghidra的安装及使用_第3张图片

五、确认安装条款

UCTF 2016 ADD之Ghidra的安装及使用_第4张图片

六、进入Ghidra

UCTF 2016 ADD之Ghidra的安装及使用_第5张图片

只留下项目管理窗口

七、创建项目

选择File->New project

UCTF 2016 ADD之Ghidra的安装及使用_第6张图片

选择Non-Shared project(非共享项目),然后next

UCTF 2016 ADD之Ghidra的安装及使用_第7张图片

修改项目路径和项目名,然后Finish

UCTF 2016 ADD之Ghidra的安装及使用_第8张图片

然后可见项目创建成功

UCTF 2016 ADD之Ghidra的安装及使用_第9张图片

八、向项目add添加文件

把要分析的文件拖进窗口里,然后OK确认

UCTF 2016 ADD之Ghidra的安装及使用_第10张图片

随后会加载,显示导入结果概要,关闭即可

UCTF 2016 ADD之Ghidra的安装及使用_第11张图片

可见项目add中已添加文件成功

UCTF 2016 ADD之Ghidra的安装及使用_第12张图片

九、分析文件

相比较IDA,Ghidra的优势在于能够直接分析mips指令

将项目中的文件拖进绿色的龙头里

UCTF 2016 ADD之Ghidra的安装及使用_第13张图片

显示还没有被分析,yes进行分析

UCTF 2016 ADD之Ghidra的安装及使用_第14张图片

显示分析选项,默认即可,选择Analyse

UCTF 2016 ADD之Ghidra的安装及使用_第15张图片

窗口中显示分析的原代码

UCTF 2016 ADD之Ghidra的安装及使用_第16张图片

十、查找main函数

选择Search->Program Text

UCTF 2016 ADD之Ghidra的安装及使用_第17张图片

搜索框里输入main,搜索域(Fields)选择Functions,选择搜索全部(Search All)

UCTF 2016 ADD之Ghidra的安装及使用_第18张图片

搜索结果中可见int main(void),单击以在代码显示器中定位到main函数位置

左侧显示反汇编代码,右侧显示C语言伪代码

UCTF 2016 ADD之Ghidra的安装及使用_第19张图片

十一、分析代码

int main(void)

{
  int iVar1;
  long lVar2;
  long lVar3;
  char *__s;
  uint uVar4;
  char challenge [10];
  char buf [64];
  
  setvbuf(stdout,(char *)0x0,2,0);
  puts("[calc]");
  puts("Type \'help\' for  help.");
  srand(0x123456);
  iVar1 = rand();
  sprintf(challenge,"%d",iVar1);
  uVar4 = 0x80;
  __s = buf;
  do {
    if (uVar4 < 2) break;
LAB_00400984:
    iVar1 = _IO_getc(stdin);
    if (iVar1 < 0) goto LAB_00400ad4;
LAB_004009a4:
    *__s = (char)iVar1;
    uVar4 = uVar4 - 1;
    __s = __s + 1;
  } while (iVar1 != 10);
  if (uVar4 == 0) goto LAB_004009c0;
  do {
    *__s = '\0';
LAB_004009c0:
    __s = strchr(buf,10);
    if (__s != (char *)0x0) {
      *__s = '\0';
    }
    iVar1 = strcmp(buf,"help");
    if (iVar1 == 0) {
      __s = "Type \'exit\' to exit.";
LAB_00400b18:
      puts(__s);
      puts("Input 2 numbers just like:");
      puts("1 2");
    }
    else {
      iVar1 = strcmp(buf,"exit");
      if (iVar1 == 0) {
        puts("Exiting...");
        return 0;
      }
      iVar1 = strcmp(buf,challenge);
      if (iVar1 == 0) {
        printf("Your input was %p\n",buf);
        uVar4 = 0x80;
        __s = buf;
        goto LAB_00400984;
      }
      __s = strchr(buf,0x20);
      if (__s == (char *)0x0) {
        __s = "Error!";
        goto LAB_00400b18;
      }
      lVar2 = strtol(buf,(char **)0x0,10);
      lVar3 = strtol(__s + 1,(char **)0x0,10);
      printf("%d + %d = %d\n",lVar2,lVar3,lVar3 + lVar2);
      if (lVar3 + lVar2 == 0x133a05e) {
        puts("Thanks,Bye~");
        return 0;
      }
    }
    uVar4 = 0x80;
    iVar1 = _IO_getc(stdin);
    __s = buf;
    if (-1 < iVar1) goto LAB_004009a4;
LAB_00400ad4:
    if (__s == buf) {
      return 0;
    }
  } while( true );
}

1.返回地址

C代码中3处return 0均指向在反汇编代码中对应的00400b08

返回地址保存在ra中

00400b08 08  00  e0  03    jr         ra                              代表跳转到返回地址

00400b0c 98  00  bd  27    _addiu     sp,sp,0x98           代表平衡堆栈0x98个字节

UCTF 2016 ADD之Ghidra的安装及使用_第20张图片

2.函数输入

输入结果保存在iVar1中

向上查找C代码,查找iVar1第一次赋值的代码

UCTF 2016 ADD之Ghidra的安装及使用_第21张图片

查看第一次赋值对应的反汇编代码

所以iVar1保存在[SP+0x24]中

3.栈区解析

UCTF 2016 ADD之Ghidra的安装及使用_第22张图片

0x70=112,故112字节可覆盖返回地址

你可能感兴趣的:(信息安全,反汇编,mips,c++)