CSAPP读书笔记2


前言

因为CSAPP中第二章讲数据的存储,最近在学校时间有点紧,所以我匆匆浏览一下发现之前做的笔记更通俗一点,但是可能有盲点,以后二刷再精读一下

一、程序机器级代码

编写一个程序

#include<stdio.h>
long mult2(long a, long b)

{

    long s = a*b;
    return s;

}

void multstore(long x,long y, long* dest)
{
    long t = mult2(x,y);
    *dest = t;
}

int main()
{
    long d;
    multstore(2,3,&d);
    printf("2 * 3 --> %ld\n",d);
    return 0;
}

在ubuntu18上利用命令编译gcc -Og -S test.c,可以得到一个test.s的文件,打开一看就是我们的汇编代码,而前面那些,以“.”开头的就是汇编器与链接器的伪指令,通常可以忽略
在这里插入图片描述
如果我们用命令gcc -Og -c test.c 得到的是一个test.o的文件,无法打开。。。但是书上说是一堆二进制格式的
在这里插入图片描述
打开gdb我们看到利用gcc命令gcc -Og -c test.c 编译出test.o后,利用gdb打开,然后输入x/14xb multstore 查看反汇编
在这里插入图片描述

这里运用的是examine命令,x的命令语法如下
x/<n/f/u> n 是一个正整数,表示需要显示的内存单元的个数,也就是说当前地址后显示几个内存单元的内容,一个内存单元的大小由后面的u定义。u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。表示一个内存地址
所以上面就是,查看multstore函数处的反汇编,展示14个以byte为格式的内存,以x的形式就是16进制的形式展现
而我们要查看整个程序的反汇编可以输入命令objdump -d test.o来查看反汇编
在这里插入图片描述

二、使用gdb调试器

开始和停止

命令效果
quit退出gdb
run运行程序
kill停止程序

在这里插入图片描述

断点

命令效果
break 函数名函数入口处下断点
break *地址地址处下断点
delete 1删除断点1
delete删除断点

在这里插入图片描述

执行

命令效果
stepi执行一条语句
stepi n执行n条语句
next i执行下一个函数调用
continue继续执行
finish执行到当前函数返回

检查代码

命令效果
disassemble查看当前函数的反汇编
disassemble 函数名字查看这个函数的反汇编
disassemble 地址地址附近函数的反汇编
disassemble 地址1,地址2查看地址1到地址2范围内的反汇编
print /x $rip十六进制数输出程序的计数器

或者下断点用vmmap查看

三、深入理解缓冲区溢出

看下gets函数的原型

char* gets()
{
    int c;
    char* dest =s; //定义了dest就是这个参数的地址
    while((c = getchar())!='\n' && c != EOF)//从getchar获取到\n和EOF结束
    {
        *dest++ = c;//这个地址每输入一次向后移动一位
    }
    if (c == EOF && dest == s)//如果一开始就输入了EOF或者没有输入,那就直接返回空
    {
        return NULL;
    }
    *dest++ = '\0'; //令最后一个为0
    return s;

}

所以将字符串复制到s指明的位置

void echo()
{
    char buf[8];
    gets(buf);
    puts(buf);
}

这里故意设置缓冲区很小,那我们就可以越界了。参考之前的pwn,各种栈的题目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值