admin管理员组

文章数量:1614997

简介

我在ctf比赛平台找到一个适合入门的题目,和这次中职比赛逆向的项目差不多,做题的套路都差不多,可以帮助大家快速入门简单的逆向有不会的可以加我qq来问我,需要这个小程序可以加我qq:3316735898,我会给你文件和工具
这次是简单的动态与静态调试,还会涉及到nop滑梯破解程序

动态调试

1.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将main函数的入口地址作为Flag值提交;

由于题目叫我们是静态调试,但我还是想教大家一些动态调试的基础,将程序拖入Ollydbg


右击,选择中文搜索引擎,搜索ASCII


我们看到了flag,但是我们要找的是程序main函数的地址,双击第二排的”欢迎来到DUTCTF“

查看最顶部的地址,是0x0083000,可以看到在这个地址,程序执行的push操作,push在汇编语言里是压栈的操作,意思是开始载入函数了,所以main函数地址为:

0x0083000

第二题由于是找关键函数,这里还是用ida方便一点,这里就不演示ollydbg如何查看调用的函数名称

3. 对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,找到Flag1值并提交;

右击,选择中文搜索引擎,搜索ASCII

第一排就是flag:

DUTCTF{We1c0met0DUTCTF}

4.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,尝试破解该二进制文件,将注册成功后的回显信息作为Flag值提交;

由于我们不知道程序叫我们输入什么(因为我用ida分析的程序,其实输入flag就会注册成功,然后回显消息,ida静态调试在下面),我们可以使用NOP覆盖,更改jmp地址,更改调用函数地址,更改正在执行test操作的eax寄存器的值等一系列破解操作,这里我们介绍NOP覆盖,什么是nop呢,Nop是无操作数,所以称为空操作,当我们nop掉jmp跳转操作时,这个跳转就失效了,我们可以继续向着我们目标前进

继续按f8,我们可以在输入flag处下一个断点,程序崩溃后,重新执行程序,可以按f9直接运行到断点处,这样更方便我们调试,断点快捷键为f2

断点意思就是让程序执行到此“停住”,不再往下执行


如何继续按下f8,发现按不动了,发现程序叫我们输入字符,我们随便输入几个字符,回车,然后又能继续执行了

继续按下f8,直到0x00883108F处,这里我们可以看到有一个跳转操作,因为我们输入错误了,我们将这个跳转操作nop掉

右击,选择二进制,nop填充

我们成功的nop掉了此地址的操作,然后我们继续按下f8,发现即使我们输入错误的值,也会显示成功注册的字符

flag get√

5.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将该激活所需的许可证码作为Flag值提交;

看下面我分析的程序源码,其实就是输入的字符与flag做对比,如果一样就成功,所以该激活所需的许可证码为:

DUTCTF{We1c0met0DUTCTF}

静态调试

1.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将main函数的入口地址作为Flag值提交;

将文件拖入ida pro





我们进入了ida,可以开始对程序开始静态分析,题目是(对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将main函数的入口地址作为Flag值提交;)
意思是我们只需要找到程序的main函数的入口即可

在ida左边的工作栏里,会显示程序和系统各种函数的入口地址,我们可以看到,这个程序main函数的入口地址为

0x00401000

2.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将该二进制文件中检查许可证的关键函数作为Flag值提交;

在这个界面按下f5

ida会尽量帮我们还原程序的源代码,分析程序源代码可以发现,检查许可证的关键函为

strcmp
strcmp函数是比较两个字符串的大小,两个字符串相同时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值

对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,找到Flag1值并提交;

对源代码开始分析:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  __int128 v5; // [esp+0h] [ebp-44h]
  __int64 v6; // [esp+10h] [ebp-34h]
  int v7; // [esp+18h] [ebp-2Ch]
  __int16 v8; // [esp+1Ch] [ebp-28h]
  char v9; // [esp+20h] [ebp-24h]

  _mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));
  v7 = 0;
  v6 = qword_413E44;                #v6被赋予了一个变量,双击这个变量就可以查询到这个变量的16进制信息
  v8 = 0;
  printf("欢迎来到DUTCTF呦\n");
  printf("这是一道很可爱很简单的逆向题呦\n");
  printf("输入flag吧:");
  scanf("%s", &v9);                 #将我们输入的字符串赋予v9
  v3 = strcmp((const char *)&v5, &v9);          #将我们输入的字符与v5做对比
  if ( v3 )
    v3 = -(v3 < 0) | 1;
  if ( v3 )
    printf(aFlag_0);            #输出a_flag0自定义函数
  else
    printf((const char *)&unk_413E90);
  system("pause");
  return 0;
}

双击进入v6变量的地址,看他被赋予的什么值

这里有两个很长的16进制,这时,我们使用IDA的另一个功能 R,选中16进制字符串能够将十进制的数转换为字符串

flag就出来了,注:这里要跟大家普及一个知识了,及大端与小端

假设一个十六进制数0x12345678

大端的存储方式是:12,34,56,78,然后读取的时候也是从前往后读

小端的存储方式是:78,56,34,12,然后读取的时候是从后往前读取

所以,最后的flag应该是:

DUTCTF{We1c0met0DUTCTF}

4.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,尝试破解该二进制文件,将注册成功后的回显信息作为Flag值提交;
我们双击运行程序,输入我们的flag

回显信息为:

falg get√

5.对靶机服务器场景桌面上的PE01.exe二进制文件进行静态调试,将该激活所需的许可证码作为Flag值提交;

看我们之前分析程序源码,其实就是输入的字符与flag做对比,如果一样就成功,所以该激活所需的许可证码为:

DUTCTF{We1c0met0DUTCTF}

关注我,之后会发ctf逆向相关的入门教程

本文标签: 网络安全静态中职入门教程程序