0%

gdb调试知识

RAP:用来存放返回值

RBP,RSP:做栈,保护栈

pop edp:ebp转换到指向原来所在地址的栈中内容(一般是个地址)


以上为编译器发展的近况,与操作系统(cpu)无关。


rax,rbx,rcx,rdx,rsi,rdi,rbp,rsp等r8之前的寄存器前三十二位为eax等(exx形式),后三十二位为xx(例:ax)。

r8之后为r8d等.(rxx形式),后32位为rxxw。


rip:存放当前执行的指令的地址。


(gdb) disassemble $rip 反编译rip中地址所对应的命令

rip可换为其对应的命令函数名(eg:main)


set disassembly-flavor intel将反编译转化为英特尔模式 在gdb运行编译程序时直接输入命令


设置断点:

b * 0x8048489

查看断点 个数,地址,所在函数位置

i b

执行到断点位置

c

查看寄存器信息

i r

使断点有效(已设置断点):

enable b id[b-id为中断编号]

enable id

使断点失效(已设置断点):

标准写法:disable b id[b-id为中断编号]

不标准写法:d 2(2指断电的num),disable 2


lea =》Load effective address(原含义)

现含义:lea rax,[rbp-0x18] 用于计算等 op后长度更短,必须加方括号,不加为原含义


xor异或指令:

eg:xor ebx,ebx (两指令)=>将ebx=0 (对比mov ebx ,0(三指令)更短)

但xor有影响标志寄存器的副作用,但mov没有


jcc系列


cmp:

大概类用于sub,减的作用。

区别:

cmp:cmp al,0x61——al-0x61不赋值且不存储,与jne对比使用(strcmp类似于cmp)

sub:sub al ,0x61——al=al-0x61赋值且存储


ni:步入

si:步过

finish:步出函数

PTR——指针

8 16 32 64 个01位(bit)

BYTE WROD DWORD QWORD

拿多少内存的数赋值


cpu进行运算。从寄存器中取数。

定义的数优先存在16个寄存器中,其余过多的参数存在虚拟内存中。

如果刚开始就过多,参数从寄存器移到虚拟内存(push),使用时候从虚拟内存移到寄存器中。

查看内存的数:

X/20i 4RIP

{与disassemble不同的一点是 x只会显示你输入的数量的相关语句,而disassemble会把所有相关语句都汇编}

20:以下20行关于XXX的指令

rip:相当于上句的xxx

i:采用汇编的形式呈现 b:以byte形式看一个字节的形式显示 g:以八个字节的形式呈现 w以四个字节的形式呈现

d:以十进制显示 (常用搭配bd) x:以十六进制显示

x/20b $rbp-0x10

看最后方地址的内容是什么,连续看20句相关内容

x/20i 0向5555555552ce

从末尾地址往下看20行以汇编形式呈现


set

*0x1111111111 =19 *地址=值

$rbp=19 $寄存器=值

{char[4]} 0x131312=“ACE”