正因是梦,尤需真活。

GDB调试程序

2022.05.29

//本次是帮一个同学完成她的选修课,本来只是打算用markdown来做个报告,但是写都写了,不如就发出来凑一下做个学期的日记。说起来这老师也是离谱,改怎么说他呢,只能说不愧是苏大的老师,讲课就是随性,哦不对,他根本没讲课,上一课是Linux安装软件,这节课就讲GDB,作为一门网课甚至没有网课视频,属实离谱…

首先点开README,读一读信息。

gdb_training: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs),
for GNU/Linux 2.6.24, BuildID[sha1]=def718c559fc3a8800b112d936843fde0fe72fe3, not stripped

32位Linux

以上较为关键的是32位的Linux,在如今这个环境,尽管我手上有四个不同的Linux发行版,但就是没有一个是32位,当然64位的系统向下兼容肯定是可以做到的,至于方法我贴在这里,有需要的同学可以去试一试$^{[1]}$,反正我没有成功。

于是我直接下了一个VirtualBox,网上找到了一个32位的镜像(Ubuntu Trusty 14.04 (LTS) (32-bit)),装了一下。

熟悉GDB操作

开始调试。
$gdb gdb_training_simple
输入断点,b break
(gdb) b main
(gdb) b *0x8048821
参看断点
(gdb) info b
运行,r run
(gdb) r
执行到下一行
(gdb) nexti
进入函数调用
(gdb) stepi
直接结束函数
(gdb) finish
直接运行到下一个断点
(gdb) c continue
参看不同寄存器
(gdb) print $eax

Web Image

Web Image

gdb有一个语法糖,回车可以重复上一个命令,这样使得我们使用步进指令时会很方便。

关于layout分割窗口主要有以下几种用法$^{[2]}$:

layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码/汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个layout
layout prev:显示上一个layout
Ctrl + L:刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。

可以一边查看代码,一边测试,非常好用。

Web Image

完成作业

首先看到main的源文件,其中有一条看似自相矛盾的判断条件,这就是我们所需要破解的地方。

  if (year > 2000) {
    puts("Failed!");
    return 0;
  }

  if (year == 2003) {
    ...
  }

正常情况下,我们怎么输入都不可能通过这个,毕竟没有数即小于等于2000也等于2003。

于是我们找到这两个if的十六进制位置。

Web Image

分别是0x80488960x80488af

打上断点

Web Image

开始运行,输入1999 3 31,首先先通过2000的判断,然后再修改为2003,进入下一个判断。

Web Image

Web Image

连续跳到最后显示

scuctf{6a558c2e185b78d75d43919278e510ac}You Are Fooled. Not CORRECT!

Web Image

似乎是我们做错了,于是看到代码,还有一个1-30的,这次我们换成10,我们再试一次。

Web Image

最后结果好像还是不正确,显示的还是

Web Image

You Are Fooled. Not CORRECT!

但相较于上面那个,少了一段a string startswith scuctf,所以我认为,答案就是

scuctf{6a558c2e185b78d75d43919278e510ac}

或者

scuctf{6a558c2e185b78d75d43919278e510ac}You Are Fooled. Not CORRECT!

//虽然看起来不像,但是作为一次选修的网课,这个过程应该是够了。

参考资料