初次接触在 centOS 环境下使用 gdb (linux基于命令行的调试器),记录一下~

  • gdb简介
    GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。
    关于centOS如何安装gdb

这里使用XCTF新手逆向中的 no strings attached 来学习关于 gdb 的简单使用:
下载程序,使用 exeinfoPE 来查壳和程序位数,显然,ELF linux可执行文件,32bit 32位程序,使用GCC编译器:

centos arm安装dpkg_linux


打开centOS,将程序拖入 , chmod -R 777 10 给程序赋予可执行权限,然后 ./10 执行观察程序功能和特殊字符串:

上来两条欢迎语句,然后提示输入认证号,随便输入,然后提示 Access denied !,程序退出;

centos arm安装dpkg_字符串_02


到这里,我们可以猜测,这个程序应该是将我们输入的字符串与正确的认证号做比较,如果错误就输出 Access denied! ,如果正确就输出flag或者正确提示啥的;

到这里,直接上 ida,来一波静态分析, shift + F12,看看有没有特殊字符串,…,显然,和题目的提示一样,没有特殊字符串来供我们分析程序╮(╯▽╰)╭:

centos arm安装dpkg_linux_03


于是观察主函数main, F5 反汇编,发现有四个函数调用:

centos arm安装dpkg_字符串_04


逐个双击跟踪查看函数功能:

  • 第一个函数跟进,暂时分析不出啥功能
  • 第二个 banner() 函数,实现输出打印 “Welcome to … ”和“Currently …”两条字符串;
  • 第三个 prompt_authentication() 函数,打印 “Please…”输入提示语;
  • 第四个 authenticate() 函数,出现 decrypt 解密字样,是一个解密函数,跟进查看:
    decrypt() 有两个参数,这两个参数已经在程序内被赋值了,然后是两个嵌套循环,这里暂时不明白这个函数具体实现什么功能,但是它的返回值赋给了 s2;所以直接分析 authenticate()这个函数:
    这个函数的大致意思是将用户的输入 与 s2 字符串做比较,如果相等就输出 success,如果不等就输出 Access denied! 。

centos arm安装dpkg_centos arm安装dpkg_05


到这里,思路就逐渐清晰了,就是将程序运行到 decrypt附近,执行decrypt, 使它生成 s2,然后我们对 s2进行读取,应该就能解题:

因为是 linux可执行文件,所以就不能用 OD 进行调试,上gdb:

打开调试文件:gdb 10 -q

在decrypt处下断点:b decrypt

然后执行到断点处:r

单步步过decrypt 函数:n

这时,结合前面的ida分析,可以从汇编代码中看见 s2的值是被放在了 eax 寄存器当中:

centos arm安装dpkg_linux_06


所以我们可以首先查看寄存器: i r

然后读取eax 中的值: x/6sw $eax
6 读取 6行数据 ; s 数据以字符串形式显示;w 四个字节形式展示;

centos arm安装dpkg_linux_07