汇编学习

脱衣操作: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工具:输出外部库函数

 

posted @ 2019-04-18 09:59  CTF_PWN日记  阅读(595)  评论(0编辑  收藏  举报