文件
- 查看文件属性:
file 文件名
- 查看程序防护:
checksec 文件名
Arch
:文件属性
RELRO
:开启后,符号重定向表格属性为只读,或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击,图中Partial RELRO表示我们对GOT表具有写的权限
Stack
:Canary Stack保护(俗称金丝雀),开启后,程序在函数返回前会设置好的金丝雀值进行检查,从而达到堆栈保护的目的
NX
:即No-eXecute(不可执行)的意思,开启后,就算溢出到shellcode位置也不可执行,cpu会抛出异常
PIE
:地址随机化
- 查看文件头信息:
readelf -h 文件名
- 查看文件二进制数据:
- 完整显示:
xxd 文件名
|od -A x -t x1z 文件名
- 显示部分:
od --skip bytes=偏移地址 --read-bytes=字节数 -A x -t x1z 文件名
x1z表示每显示一个十六进制数输出一个空格;x2z表示每显示两个十六进制数输出一个空格
- 查看GOT表:
objdump -g 文件名
- 下载远程目录中的程序:
scp -P 端口号 -p IP地址:路径/* ./
- 将文件内容作为输入并执行文件:
cat payload文件 -| ./文件名
函数
- 检索程序导入的函数:
objdump -R 文件名
- 查看程序所有函数及反汇编:
objdump -d 文件名
反汇编单个函数 – 脚本:#!/bin/bash vmlinux=$1 symbol=$2 if [ -z "$vmlinux" ]; then echo "usage : $0 vmlinux symbol" exit fi startaddress=$(nm -n $vmlinux | grep "\w\s$symbol" | awk '{print "0x"$1;exit}') endaddress=$(nm -n $vmlinux | grep -A1 "\w\s$symbol" | awk '{getline; print "0x"$1;exit}') if [ -z "$symbol" ]; then echo "dump all symbol" objdump -d $vmlinux else echo "start-address: $startaddress, end-address: $endaddress" objdump -d $vmlinux --start-address=$startaddress --stop-address=$endaddress fi
python
- 执行文件,并将payload作为输入:
python -c 'print "payload"' | ./文件名
- 将payload写入文件:
python -c 'print [payload]' > payload
反汇编
- 查找可存储寄存器的代码,用于构造ROP链:
ROPgadget --binary 文件名 | grep 指令
ROPgadget --binary 文件名 --only 指令
- 自动生成ROP链(若存在),只适用于静态链接:
ROPgadget --binary 文件名 --ropchain
- 对文件二进制进行反汇编:
ndisasm -u 文件名
其它
- 生成字符串队列:
cyclic 字符数
- 计算字符串偏移:
cyclic -l 四个字母