Linux动态调试神器之GDB简介及使用

GDB简介

这个是在Linux下的一个动态调试,和OD功能上应该差不多。

功能

  • 和OD差不多,但是看不到原文,所以要和IDA一起用

  • 暂停【然后调试】

  • 除此之外,GDB还具有一些独具特色的功能,如命令自动补全功能、命令

    行编辑功能、面向对象语言支持(如C++)、多线程支持等。

命令

gdb

打开文件

1
gdb hero
image-20230521190849865

quit

退出

也可以用 ctrl+ c【一个消耗时间的】或者 ctrl + d【就是退出,相当于quit】

image-20230521191003690

help

可以使用help命令,来得到GDB的帮助信息。

image-20230521191302618

这个help 会大概列出来

然后可以选中一个再help 就可以看到详细的内容。

image-20230521192410070

网鼎杯2020真题-hero

首先用010 打开看看

image-20230521195516646

发现是一个elf 文件,去kali里面运行一下

image-20230521195546759

发现大致就是一个闯关打boss的,应该是只要通关就可以得到flag

放入IDA中看看

通过这个字符串搜索找到这个位置

image-20230521200757904

应该就是这里,然后F5一下

image-20230521200941100

这里大概就是能打过boss的战斗力

10000/30000/50000

….

然后找到

每一个跳转语句

image-20230521201204657

知道这个就是一个cmp eax和10000/30000/50000相互比较

得到的地址:

.text:000000000040165C

.text:00000000004016BC

.text:00000000004015F9

讲实话,如果是在OD里面我可以直接把flag中的值改掉,直接就不跳转。应该思路没啥问题。

这里我们也可以手动设置eax中的值的大小

然后在gdb 中 在这三个地方设置断点

image-20230521202016922

用b 来设置断点

1
b *0x4015F9 b *0x40165C b *0x4016BC

image-20230521202403684

姿势1

然后就是,运行过去,然后设置eax中的值,让它大于500000就好了

1
set $eax = 0x4C4B41
image-20230521202536717 image-20230521202918567

ok 打赢了怪兽

姿势2

整数溢出

【百度】

image-20230521203223629

由于这段代码出现的问题

它写的是%d

image-20230521203718500

所以int形的

image-20230521203735233

是一种int 形式的,并且攻击力和硬币都是由于v1来控制的。所以

int 型表示的十进制数据范围是-2147483648-2147483647 ,当v2>2147483647时会造成整数溢出,溢

出后就会变为负数。故当v2 mod 2147483647时,能够执行充值硬币和攻击力,即(coin -2 x v2) mod

2147483648 <= 2147483647 。

当v2 mod 2147483648 >= 107374183647 时可执行 elf += v2 ,coin += v3

image-20230521204410174