linux下常用指令

linux常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
1. 文件目录
1.1 特殊符号:
1.1.1 . 当前目录
1.1.2 .. 上级目录
1.1.3 ~ 用户的home目录
1.2 cd - 切换目录
1.3 ls - 查看目录/文件属性
1.4 mv/cp/rm 剪切/拷贝/删除文件
1.5 rmdir 删除空目录
1.6 touch 创建新文件
1.7 查看文件内容 more(按页查看)/less(部分查看)/cat(查看全部)/head(查看前x行)/tail(查看后x行)
1.8 hexdump 以十六进制查看文件
hexdump -C 文件名
hexdump -C 文件名 | less
1.9 ln 创建文件链接
1.10 file - 查看文件类型
1.11 grep - 查找文件内容
1.12 find/whereis/whois
<!-- more -->
2. 用户/权限
2.1 useradd(命令)/adduser(脚本) 添加目录
2.1 passwd 修改用户登陆密码
2.3 userdel 删除用户
2.4 usermod 修改用户信息(用户名/主目录/用户组/登陆密码)
2.4 chmod 修改文件权限
2.5 chown 修改文件拥有者
2.6 groupadd/groupdel 添加用户组/删除用户组

3. 进程/任务
3.1 ps/top 查看当前进程信息
3.2 kill 结束进程

4. 磁盘
4.1 df/du 查看磁盘使用信息

5. 其它
clear - 清屏
source - 强行让一个脚本去立即影响当前的环境(不重启而更新配置)
apt - 软件包管理
更新源 sudo apt update
更新软件 sudo apt upgrade
安装软件 : sudo apt install 软件名
卸载软件 : sudo apt remove / sudo apt autoremove


6. 常见配置文件

GDB常用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1 命令行参数系列
1.1 set args
1.2 show args

2 运行系列
2.1 r - 运行
2.2 n - 单步步过(源码)
2.3 s - 单步步入
2.4 u - 运行到循环退出
2.5 c - 继续运行
2.6 si/ni - 汇编级单步步入/步过
2.7 jump - 设置eip到指定位置
2.8 finish 执行到当前函数返回
2.9 回车键 重复执行上一指令

3 断点系列
3.1 b 行号/函数名 - 设置断点
3.2 info b - 查看断点
3.3 d 断点号 - 删除断点
3.4 dis 断点号 - 禁用断点
3.5 enable 断点号 - 启用断点

4 信息查看系列
4.1 print 变量名 - 查看变量的值
4.2 set 变量名=VAL - 修改变量的值
4.3 set disassembly-flavor intel 以intel方式查看反汇编
4.4 list [函数名] - 查看源码
4.5 backtrace 查看函数的调用的栈帧和层级关系,简写bt
4.6 frame:切换函数的栈帧,简写f
4.7 x命令
格式 x/<n/f/u> <addr>
n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果 地址是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
n/f/u三个参数可以一起使用。例如:

命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
输出格式:
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

ELF文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
PE的组成

1. 头部
1.1 DOS头
1.2 NT头
1.2.1 文件头
1.2.2 扩展头
1.3 区段头
2. 区段数据
2.1 代码段: .text
2.2 数据段: .data
2.3 只读数据段: .rdata
2.3.1 导入表的数据
2.3.2 导出表的数据
2.4 重定位数据段: .reloc

ELF文件格式
ELF的组成部分

1. ELF头
1.1 id数组
1.1.1 前4位是魔数 0x74"elf"
1.1.2 ELF文件种类(32位/64位)
1.1.3 ELF文件数据的字节序(小端/大端)
1.1.4 版本 : 1. 文件版本,2. 系统ABI版本
1.2 文件类型 : 可重定位文件/可执行文件/动态库文件
2. 程序头
2.1 段类型 : 决定了段的作用,以及段是否被加载到内存中. 一个ELF文件中,至少存在一个LOAD类型的段. ELF一般都有解释器段,这个段用于保存解释器的文件路径. 有可能也会存在动态链接段(用于链接外部模块)
2.2 段数据的文件偏移/文件大小/内存地址/内存中的大小
2.3 加载到内存中后的分页属性
2.4 段的对齐粒度
3. 区段头
3.1 区段名
3.2 区段类型
3.3 Link和info
3.4 区段数据的文件偏移和大小,元素大小.
4. 区段数据
4.1 符号表
4.1.1 记录本模块的符号(导出)
记录在.symtab符号表中
记录一个符号的名字(例如函数名),记录了符号
的绑定类型(LOCAL,GLOBAL),还记录了符号的类型(函数,区段),记录符号的值(根据符号的不同,有不同的值,例如函数是符号类型,值就是函数的地址)
4.1.2 记录了导入的符号
记录在.dynsym符号表
4.2 重定位表
4.2.1 重定位类型, 决定了修复重定位的方法
可执行文件类型的ELF和共享库的ELF文件的重定位是不一样的.
4.2.2 重定位的偏移(根据重定位类型决定)

elf的加载
do_execve();

1. 其它
5.1 PLT和GOT表
call printf ==> jmp [GOT表项地址] =第二次以后=> printf真正的地址
​ push XX
​ jmp xxx ==> 加载printf所在的so文件,修复printf函数地址


2 构造函数数组,析构函数数组
2.1 全局对象的初始化和析构.
3 ptrace - 调试相关