GDB调试Linux程序流程

安装加强工具gef
有符号表可以根据变量名函数名等进行调试
在程序编译时一定要加上-g的参数,把源程序信息编译到执行文件中
在这里插入图片描述
寄存器
eax存返回值
p $eax=0#修改寄存器的值
64位linux操作系统中
函数调用参数依次存放在rdi rsi rdx rcs r8 r9,超过6个则将多出的参数压入栈
32位不存寄存器,直接压栈
常用指令
vmmap #查看地址段
heap #查看堆
p value/d #十进制打印
p result =0#给变量赋值
x/20w(word)x(hex) 0x604010(address)#查看此内存20个字长度的16进制数
x/20bx
x/20#不写单位默认gz
x/20gz#八字节查看内存地址的值
info frame(栈) 0(第0个栈)#查看当前栈的内容,rip为当前执行位置
x/10i address#查看地址代码
l(list) 函数名#查看函数代码,用set listsize *设置显示行数
stack 100#查看100行栈布局

条件断点
b 行/函数/… if(var == value)
b 41 if pdata->id==2
b 函数名
查看符号表

readelf -s 程序

查看入口地址
在这里插入图片描述
GDB si,ni,s,n的区别
n/s都是C语言级的断点定位。 s会进入C函数内部,但是不会进入没有定位信息的函数(比如没有加-g编译的代码,因为其没有C代码的行数标记,没办法定位),n不会。

ni/si都是汇编级别的断点定位。si会进入汇编和C函数内部,ni不会。

归纳:当要进入没有调试信息的库函数调试的时候,用si是唯一的方法。

当进入有调试信息的函数,用si和s都可以,但是他们不同,si是定位到汇编级别的第一个语句,但是s是进入到C级别的第一个语句

譬如si就是在0x80483e8.用s就是0x80483f1;

多线程与多进程调试
在这里插入图片描述
破解与防破解
Linux保护机制
在这里插入图片描述
系统ASLR没开,PIE无效
canary写入哈希,运行时比对
加壳

发布了51 篇原创文章 · 获赞 5 · 访问量 381

猜你喜欢

转载自blog.csdn.net/qq_42078231/article/details/103772704