参考博客
知识点
gdb
-
jump 函数名 / * 地址名
jump 能够很灵活地在gdb调试汇编代码时跳转
当一不小心错过了关键信息时,我们便可以使用jump
-
run(简写为r) 参数1 参数2 ...
当我们在调试gdb想要携带参数时,通过
gdb bomb input.txt
是不可以行的应该在
run
后加上参数
-
layout src
显示源码layout asm
显示汇编代码layout split
源码和汇编代码都显示ctrl+x+a
快捷退出layout
-
x/[count][format] [address]
打印内存值,从所给地址(address)处开始,以指定格式(format)显示 count 个值
比较强大的用法是
x/s address
可以打印出字符串出来x/100i address
可以从address开始打印出100条指令出来
-
info register (指定寄存器名,如rax)
打印寄存器的值
info register rax
指定打印rax的值i r rax
可以这样简写
炸弹2:Phase_2 栈中探险
这个主打的就是一个静下心来分析栈中的内容
解决这个问题的关键我总结为3个:
-
知道参数传递时寄存器的时候以及在栈的使用
-
在汇编代码中对内存地址有敏感性
开始我看到这个
0x4022b4
我是一点反应都没有,后来看题解才知道用x/s 0x4022b4
-
知道sscanf的使用方法
sscanf 第一个参数是char *, 第二个参数是想要格式化输入的格式,后面的参数是接受数据的变量,返回值是接受到数据的个数
还有就是我发现汇编中调用函数后,都喜欢把返回值放到%rax或%eax中,这点很重要
知识点
在函数a中调用函数b,我们函数a中要将参数放到指定的6个寄存器上。
(有个有趣的点是:调用者保存寄存器都是用来保存参数的寄存器)
当参数超过6个,函数a就要在自己的栈帧上分配空间用来放参数,且参数越在后面,越先入栈
这点是符合直觉的,因为参数越在后面可能越后别用到。P169
如上图,在本帧中具体顺序是:被保存的寄存器 局部变量 参数构造区(也就是放过多参数的地方)P164
在通过栈存放参数时,所有数据都是向8的倍数对齐 P169
但是我们通过栈存放局部变量,大多数情况并不是这样 P170(栈上的局部存储)P196(数组存放到栈中)P190(数据对齐)
在x86-64中,我们的处理器一次能够处理64个位,一次也能够取到64位
我们的内存(注意,栈也在内存中),是以1字节(8位)作为单位编号,所以 64位/8位=8
所以我们经常能够看到如下栈表示(内存表示):
但是我觉得实际分析起来还是如下更好分析:
标签:CSAPP,Bomb,寄存器,Lab,gdb,参数,address,layout,rax From: https://www.cnblogs.com/cilinmengye/p/18069388