kk Blog —— 通用基础

date [-d @int|str] [+%s|"+%F %T"]

使用BBSwitch禁用独显(Nvidia)

1-安装编译环境、内核源码和内核头文件 (假设你刚刚装完系统)

1
2
3
apt-get install build-essential      (安装编译环境 )
apt-get install linux-source        (安装内核源文件)
apt-get install linux-headers-$(uname -r) (这安装对应当前内核版本的头文件)

2-查看当前的显卡

1
# lspci | grep VGA

行末的(rev ff)表示关闭状态,其他表示开启状态

3-下载BBswitch源码 ,并编译安装

可以进入https://github.com/Bumblebee-Project/bbswitch点击download zip下载源码(大概23KB)
解压并cd到对应目录,然后make,再make install。
* ubuntu 10.04需要将pr_warn改成printk或者找到正确头文件

4-开启或者禁用独显

1
2
3
modprobe bbswitch                (加载bbswitch模块)
tee /proc/acpi/bbswitch <<<OFF   (禁用独显,我的本本显卡指示灯变成蓝色,说明启用了核显) 
tee /proc/acpi/bbswitch <<<ON    (启用独显,我的本本显卡指示灯变成白色,说明独显启用)

可以用命令查看独显状态

1
cat /proc/acpi/bbswitch

5-启动系统时执行禁用独显

将启动系统禁用独显这个动作写入 /etc/modprobe.d/bbswitch.conf 文件中

1
# echo 'options bbswitch load_state=0'> /etc/modprobe.d/bbswitch.conf 

解释:bbswitch可以带参数的 ,上面的语句表示禁用独显,=号后面的数字说明:-1是不改变显卡状态,0是关闭独显,1是开启独显。load_state表示加载这个模块的动作。比如我要加载模块时关闭独显,卸载模块时启用独显,那么可以这样写:

1
# echo 'options  bbswitch load_state=0 unload_state=1'> /etc/modprobe.d/bbswitch.conf 

然后,vi编辑/etc/rc.local 文件中的exit0的前面加一行代码,完成开机执行加载bbswitch的动作

1
modprobe bbswitch

Bash软件安全漏洞检测及解决方案

http://www.techweb.com.cn/ucweb/news/id/2079505

redhat官方提供漏洞详情

A flaw was found in the way Bash evaluated certain specially crafted environment variables. An attacker could use this flaw to override or bypass environment restrictions to execute shell commands. Certain services and applications allow remote unauthenticated attackers to provide environment variables, allowing them to exploit this issue.

redhat官方提供检测方式

运行命令:

1
  $ env x='() { :;}; echo vulnerable'  bash -c "echo this is a test"

如果返回以下内容:则请尽快升级。

1
2
 vulnerable
this is a test

http://seclists.org/oss-sec/2014/q3/650

The technical details of the vulnerability follow.

Bash supports exporting not just shell variables, but also shell functions to other bash instances, via the process environment to (indirect) child processes. Current bash versions use an environment variable named by the function name, and a function definition starting with “() {” in the variable value to propagate function definitions through the environment. The vulnerability occurs because bash does not stop after processing the function definition; it continues to parse and execute shell commands following the function definition. For example, an environment variable setting of

1
  VAR=() { ignored; }; /bin/id

will execute /bin/id when the environment is imported into the bash process. (The process is in a slightly undefined state at this point. The PATH variable may not have been set up yet, and bash could crash after executing /bin/id, but the damage has already happened at this point.)

The fact that an environment variable with an arbitrary name can be used as a carrier for a malicious function definition containing trailing commands makes this vulnerability particularly severe; it enables network-based exploitation.

So far, HTTP requests to CGI scripts have been identified as the major attack vector.

A typical HTTP request looks like this:

1
2
3
GET /path?query-param-name=query-param-value HTTP/1.1  
Host: www.example.com  
Custom: custom-header-value  

The CGI specification maps all parts to environment variables. With Apache httpd, the magic string “() {” can appear in these places:

  • Host (“www.example.com”, as REMOTE_HOST)
  • Header value (“custom-header-value”, as HTTP_CUSTOM in this example)
  • Server protocol (“HTTP/1.1”, as SERVER_PROTOCOL)

The user name embedded in an Authorization header could be a vector as well, but the corresponding REMOTE_USER variable is only set if the user name corresponds to a known account according to the authentication configuration, and a configuration which accepts the magic string appears somewhat unlikely.

In addition, with other CGI implementations, the request method (“GET”), path (“/path”) and query string (“query-param-name=query-param-value”) may be vectors, and it is conceivable for “query-param-value” as well, and perhaps even “query-param-name”.

The other vector is OpenSSH, either through AcceptEnv variables, TERM or SSH_ORIGINAL_COMMAND.

Other vectors involving different environment variable set by additional programs are expected.

通用寄存器编码表

  • 来源:systemtap-2.4/runtime/loc2c-runtime.h

    x86_64

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define pt_dwarf_register_0(regs)       regs->rax
#define pt_dwarf_register_1(regs)       regs->rdx
#define pt_dwarf_register_2(regs)       regs->rcx
#define pt_dwarf_register_3(regs)       regs->rbx
#define pt_dwarf_register_4(regs)       regs->rsi
#define pt_dwarf_register_5(regs)       regs->rdi
#define pt_dwarf_register_6(regs)       regs->rbp
#define pt_dwarf_register_7(regs)       regs->rsp
#define pt_dwarf_register_8(regs)       regs->r8
#define pt_dwarf_register_9(regs)       regs->r9
#define pt_dwarf_register_10(regs)      regs->r10
#define pt_dwarf_register_11(regs)      regs->r11
#define pt_dwarf_register_12(regs)      regs->r12
#define pt_dwarf_register_13(regs)      regs->r13
#define pt_dwarf_register_14(regs)      regs->r14
#define pt_dwarf_register_15(regs)      regs->r15

i386

1
2
3
4
5
6
7
8
#define pt_dwarf_register_0(regs)       regs->eax
#define pt_dwarf_register_1(regs)       regs->ecx
#define pt_dwarf_register_2(regs)       regs->edx
#define pt_dwarf_register_3(regs)       regs->ebx
#define pt_dwarf_register_4(regs)       (user_mode(regs) ? regs->esp : (long)®s->esp)
#define pt_dwarf_register_5(regs)       regs->ebp
#define pt_dwarf_register_6(regs)       regs->esi
#define pt_dwarf_register_7(regs)       regs->edi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
寄存器编码    8    16    32    64
000    al    ax    eax    rax
001    dl    dx    edx    rdx
010    cl    cx    ecx    rcx
011    bl    bx    ebx    rbx
100    ?    si    esi    rsi
101    ?    di    edi    rdi
110    ?    bp    ebp    rbp
111    ?    sp    esp    rsp
1000    r8b    r8w    r8d    r8
1001    r9b    r9w    r9d    r9
1010    r10b    r10w    r10d    r10
1011    r11b    r11w    r11d    r11
1100    r12b    r12w    r12d    r12
1101    r13b    r13w    r13d    r13
1110    r14b    r14w    r14d    r14
1111    r15b    r15w    r15d    r15

1.5倍空间归并排序--Knuth

divide-and-conquer algorithm, in the style suggested by Knuth volume 3 (2nd edition),

1
2
3
4
5
6
7
8
   |-------------I-------------|-------------|

         p1            p2            ex

p1+p2原数组,p1前半部分,p2后半部分,ex额外空间
1、将p2用ex额外空间排到p2
2、将p1排到ex
3、将p2、ex合并到原数组

dd 命令

贴自http://www.chinaunix.net/old_jh/4/1025448.html dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

1. 命令简介

dd 的主要选项:

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
指定数字的地方若以下列字符结尾乘以相应的数字:
b=512, c=1, k=1024, w=2, xm=number m
if=file
输入文件名,缺省为标准输入。
of=file
输出文件名,缺省为标准输出。
ibs=bytes
一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。
obs=bytes
一次写 bytes 个字节(即一个块大小为 bytes 个字节)。
bs=bytes
同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。
cbs=bytes
一次转换 bytes 个字节,即转换缓冲区大小。
skip=blocks
从输入文件开头跳过 blocks 个块后再开始复制。
seek=blocks
从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。
count=blocks
仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
conv=conversion[,conversion...]
用指定的参数转换文件。
转换参数:
ascii 转换 EBCDIC 为 ASCII。
ebcdic 转换 ASCII 为 EBCDIC。
ibm 转换 ASCII 为 alternate EBCDIC.
block 把每一行转换为长度为 cbs 的记录,不足部分用空格填充。
unblock 使每一行的长度都为 cbs ,不足部分用空格填充。
lcase 把大写字符转换为小写字符。
ucase 把小写字符转换为大写字符。
swab 交换输入的每对字节。 
noerror 出错时不停止。
notrunc 不截短输出文件。
sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

2.实例分析

2.1.数据备份与恢复
2.1.1整盘数据备份与恢复

备份:
dd if=/dev/hdx of=/dev/hdy
将本地的/dev/hdx整盘备份到/dev/hdy
dd if=/dev/hdx of=/path/to/image
将/dev/hdx全盘数据备份到指定路径的image文件
dd if=/dev/hdx | gzip >/path/to/image.gz
备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
恢复:
dd if=/path/to/image of=/dev/hdx
将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/hdx
将压缩的备份文件恢复到指定盘

2.1.2.利用netcat远程备份

dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
在源主机上执行此命令备份/dev/hda
netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
在目的主机上执行此命令来接收数据并写入/dev/hdc
netcat -l -p 1234 | bzip2 > partition.img
netcat -l -p 1234 | gzip > partition.img
以上两条指令是目的主机指令的变化分别采用bzip2 gzip对数据进行压缩,并将备份文件保存在当前目录。

2.1.3.备份MBR

备份:
dd if=/dev/hdx of=/path/to/image count=1 bs=512
备份磁盘开始的512Byte大小的MBR信息到指定文件
恢复:
dd if=/path/to/image of=/dev/hdx
将备份的MBR信息写到磁盘开始部分

2.1.4.备份软盘

dd if=/dev/fd0 of=disk.img count=1 bs=1440k
将软驱数据备份到当前目录的disk.img文件

2.1.5.拷贝内存资料到硬盘

dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件

2.1.6.从光盘拷贝iso镜像

dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件

2.2.增加Swap分区文件大小

dd if=/dev/zero of=/swapfile bs=1024 count=262144
创建一个足够大的文件(此处为256M)
mkswap /swapfile
把这个文件变成swap文件
swapon /swapfile
启用这个swap文件
/swapfile swap swap defaults 0 0
在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行

2.3销毁磁盘数据

dd if=/dev/urandom of=/dev/hda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。

2.4磁盘管理
2.4.1.得到最恰当的block size
1
2
3
4
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file    
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小

2.4.2测试硬盘读写速度
1
2
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度

2.4.3.修复硬盘

dd if=/dev/sda of=/dev/sda
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生magnetic flux point。当磁头读到这些区域时会遇到困难,并可能导致I/O 错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。