linux动态调试之GDB(26)
Linux动态调试神器之GDB简介及使用
GDB简介
这个是在Linux下的一个动态调试,和OD功能上应该差不多。
功能
和OD差不多,但是看不到原文,所以要和IDA一起用
暂停【然后调试】
除此之外,GDB还具有一些独具特色的功能,如命令自动补全功能、命令
行编辑功能、面向对象语言支持(如C++)、多线程支持等。
命令
gdb
打开文件
1 | gdb hero |
quit
退出
也可以用 ctrl+ c【一个消耗时间的】或者 ctrl + d【就是退出,相当于quit】
help
可以使用help命令,来得到GDB的帮助信息。
这个help 会大概列出来
然后可以选中一个再help 就可以看到详细的内容。
网鼎杯2020真题-hero
首先用010 打开看看
发现是一个elf 文件,去kali里面运行一下
发现大致就是一个闯关打boss的,应该是只要通关就可以得到flag
放入IDA中看看
通过这个字符串搜索找到这个位置
应该就是这里,然后F5一下
这里大概就是能打过boss的战斗力
10000/30000/50000
….
然后找到
每一个跳转语句
知道这个就是一个cmp eax和10000/30000/50000相互比较
得到的地址:
.text:000000000040165C
.text:00000000004016BC
.text:00000000004015F9
讲实话,如果是在OD里面我可以直接把flag中的值改掉,直接就不跳转。应该思路没啥问题。
这里我们也可以手动设置eax中的值的大小
然后在gdb 中 在这三个地方设置断点
用b 来设置断点
1 | b *0x4015F9 b *0x40165C b *0x4016BC |
姿势1
然后就是,运行过去,然后设置eax中的值,让它大于500000就好了
1 | set $eax = 0x4C4B41 |
ok 打赢了怪兽
姿势2
整数溢出
【百度】
由于这段代码出现的问题
它写的是%d
所以int形的
是一种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