汇编学习
脱衣操作:strip + 文件名
1. 程序没有开启调试信息,未开启PIE保护时,用IDA静态分析查看函数地址
然后用指令:b *【静态分析得到地址】查看调试信息
2. 程序没有开启调试信息,开启PIE保护时。
步骤:
(1)gdb
(2)starti:程序断在start入口地址(动态调试的地址),实际和IDA分析不一样
(3)vmmap 查看具有 x 权限的 startstartaddr
mianrealaddr = startstartaddr + IDA查看main函数偏移地址(界面最下面有显示)
3. test和cmp指令比较
cmp a1 , a2 :a1 - a2 用于修改标志位,条件跳转根据标志位跳转
test a1 , a2:a1 and a2 不存,SF或ZF为1则跳转
and a1 , a2:a1 and a2 存在a1
4. 区别jle和jnz
jle:带符号比较,小于或等于则转移
jnz:jump if not zero 结果不为零则转移
ja:无符号数的大于
jb:无符号数的小于
jg:有符号数大于
jl:有符号数小于
5.
6. gdb-peda常用调试指令
启动调试过程:
(1)gdb --arps ./filename 参数
(2)starti
(3)vmmap查看start地址
(4)b *(startaddr+偏移)
7. ldd ./filename:查看关联动态库
第三章: 结构体类型变量
一、结构体类型变量识别
1. 汇编层面是否有无符号由指令决定;
声明与定义区别:存在、分配存储空间
IDA:view-open subview-structure:d(a) dq:8字节;dd:4字节;db:1字节(利用insert创建结构体,利用d键切换)
变量右键 convert to structure* ——转为我们定义的变量
二. 类的识别
全局数据存储在.data段;构造函数::全局对象在main调用前创建,局部对象在调用时创建
特点:1.数据成员不共享,函数成员共享;2.static int c;共享数据变量;3.
public:
A();构造函数:初始化调用
~A();析构函数:程序快结束调用
static int c
小工具使用:c++file + 莫名其妙的字符串:查看本来面目
new——mlloc+构造;delete——析构+free
三. 类的合成、继承(派生)
mov rax,fs:28h 堆栈cookie(canary)
mov [rbp+var_18],rax
1.合成(显示包含)
B和A的指针指向堆栈空间的不同起始地址,包含
在b的构造函数里:先调用A成员构造 再 XXX :重在理解
在b的析构函数里:先XXX再调用A的析构
2.继承(隐式包含)
B和A的指针指向堆栈空间的同一起始地址,等价
四. 类的多态
消息:调用类的某个成员函数
行为: 成员函数具体做的事情及执行结果
静态绑定:
动态绑定:
五. 值传递和引用传递
.init存储内容:
.fini存储内容:
安装ltrace工具:输出外部库函数