4.2 Linux 命令行技巧

通配符

  • *:匹配任意字符

    • ls test*

  • ?:匹配任意单个字符

    • ls test?

  • [...]:匹配括号内的任意单个字符

    • ls test[123]

  • [!...]:匹配除括号内字符以外的单个字符

    • ls test[!123]

重定向输入字符

有时候我们需要在 shell 里输入键盘上没有对应的字符,如 0x1F,就需要使用重定向输入。下面是一个例子:

从可执行文件中提取 shellcode

注意:在 objdump 中空字节可能会被删除。

查看进程虚拟地址空间

有时我们需要知道一个进程的虚拟地址空间是如何使用的,以确定栈是否是可执行的。

下面我们分别来看看可执行栈和不可执行栈的不同:

当使用 -z execstack 参数进行编译时,会关闭 Stack Protector。我们可以看到在 a.out1 中的 stackrw 的,而 a.out2 中则是 rwx 的。

maps 文件有 6 列,分别为:

  • 地址:库在进程里地址范围

  • 权限:虚拟内存的权限,r=读,w=写,x=执行,s=共享,p=私有

  • 偏移量:库在进程里地址偏移量

  • 设备:映像文件的主设备号和次设备号,可以通过通过 cat /proc/devices 查看设备号对应的设备名

  • 节点:映像文件的节点号

  • 路径: 映像文件的路径,经常同一个地址有两个地址范围,那是因为一段是 r-xp 为只读的代码段,一段是 rwxp 为可读写的数据段

除了 /proc/<PID>/maps 之外,还有一些有用的设备和文件。

  • /proc/kcore 是 Linux 内核运行时的动态 core 文件。它是一个原始的内存转储,以 ELF core 文件的形式呈现,可以使用 GDB 来调试和分析内核。

  • /boot/System.map 是一个特定内核的内核符号表。它是你当前运行的内核的 System.map 的链接。

  • /proc/kallsymsSystem.map 很类似,但它在 /proc 目录下,所以是由内核维护的,并可以动态更新。

  • /proc/iomem/proc/<pid>/maps 类似,但它是用于系统内存的。如:

ASCII 表

ASCII 表将键盘上的所有字符映射到固定的数字。有时候我们可能需要查看这张表:

Hex 转 Char:

Char 转 Hex:

nohup 和 &

nohup 运行命令可以使命令永久的执行下去,和 Shell 没有关系,而 & 表示设置此进程为后台进程。默认情况下,进程是前台进程,这时就把 Shell 给占据了,我们无法进行其他操作,如果我们希望其在后台运行,可以使用 & 达到这个目的。

该命令的一般形式为:

前后台进程切换

可以通过 bg(background)和 fg(foreground)命令进行前后台进程切换。

显示Linux中的任务列表及任务状态:

将进程放到后台运行:

将后台进程放到前台运行:

cat -

通常使用 cat 时后面都会跟一个文件名,但如果没有,或者只有一个 -,则表示从标准输入读取数据,它会保持标准输入开启,如:

更进一步,如果你采用 cat file - 的用法,它会先输出 file 的内容,然后是标准输入,它将标准输入的数据复制到标准输出,并保持标准输入开启:

有时我们在向程序发送 paylaod 的时候,它执行完就直接退出了,并没有开启 shell,我们就可以利用上面的技巧:

这样就得到了 shell。

Last updated

Was this helpful?