工具使用(长期更新):
编程开发
环境变量设置
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH #设置动态链接库路径,只对当前终端生效
export D5000_HOME=/home/closure/Desktop/tj/D5000 #设置环境变量D5000_HOME,用于程序获取该环境变量
python
多版本安装切换:
update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives --install /usr/bin/python python /usr/bin/python3.10 2
update-alternatives --config python
虚拟环境
#创建虚拟环境
python3 -m venv myenv
#激活虚拟环境
source myenv/bin/activate
#在虚拟环境中安装依赖
pip3 install -r requirements.txt
交叉编译
信息获取
#内核版本
cat /proc/version
uname -a
uname -r
#Linux版本信息
lsb_release -a
cat /etc/issue
#系统位数
getconf LONG_BIT
file /bin/ls
#系统架构
arch
dpkg --print-architecture
file /lib/systemd/systemd
环境搭建:
#32位库安装
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libncurses5-dev lib32z1
sudo apt install libc6:i386 libstdc++6:i386
#arm
sudo apt install gcc-arm-linux-gnueabihf
sudo apt install g++-arm-linux-gnueabihf
#MIPS
#依赖
sudo apt install linux-libc-dev-mips-cross libc6-mips-cross libc6-dev-mips-cross binutils-mips-linux-gnu
# 安装 32 位编译器
sudo apt install gcc-mips-linux-gnu
sudo apt install g++-mips-linux-gnu
# 安装 64 位编译器
sudo apt install gcc-multilib-mips-linux-gnu
sudo apt install g++-multilib-mips-linux-gnu
gcc
将lib.c编译成一个共享对象文件;
gcc -fPIC -shared -o lib.so lib.c
得到lib.so
编译链接(动态链接)
gcc -o p1 p1.c ./lib.so
Git
#拉取仓库
git clone <仓库URL>
#初始化Git仓库
git init
#将要上传的文件添加至上传暂存区
git add <filename>
#创建一个提交,编辑提交消息
git commit -m "提交消息"
#查看提交日志
git log
#连接到指定远程仓库
git remote add <origin> <远程仓库URL>
#查看当前远程仓库配置
git remote -v
#删除远程仓库配置
git remote remove <origin>
#检查本地分支
git branch
#创建并切换到该分支
git checkout -b <分支名>
#上传至指定仓库的指定分支
git push <origin> <分支>
#更新本地分支
git pull <origin> <分支>
#添加缓冲区大小
git config --global http.postBuffer 524288000
#SSL证书问题
git config --global http.sslVerify "false"
Hexo
#清除缓存文件
hexo clean
#创建新文件
hexo new "filename"
#创建静态文件
hexo g
#上传至Github
hexo d
#在线运行
hexo s
Nodejs
nvm:管理nodejs版本
调试
GDB/pwndbg/peda/gef
安装:
#gdb
# https://ftp.gnu.org/gnu/gdb/
调试其他架构:
sudo apt-get install gdb-multiarch
gdb-multiarch
#设置架构
set architecture arm
set architecture mips
#大小端序
set endian little
set endian big
#连接
target remote [IP]:[PORT]
Gdbserver
获取并解压GDB源码:
wget https://ftp.gnu.org/gnu/gdb/gdb-12.1.tar.gz
tar zxvf gdb-12.1.tar.gz
编译:
cd gdb-12.1
mkdir gdb-12.1_arm #存放编译后文件
cd gdbserver/
#armv7l arm架构第7版 小端序
CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" ./configure --target="arm-linux-gnueabihf" --host="arm-linux-gnueabihf" --prefix=/home/closure/Desktop/tools/gdb-12.1/gdb-12.1_arm LDFLAGS="-static"
sudo make -j$(nproc)
sudo make install
使用:
#程序
./gdbserver :1234 [程序]
#进程
./gdbserver :1234 --attach [PID]
*为可选
GDB原生命令 | 缩写 | 说明 |
---|---|---|
gdb <file> <*pid> | gdb加载一个程序 | |
gdb attach <pid> | gdb.attach()可写入脚本中==》相当于断点 | |
set args <*argv> | 设置程序运行参数 | |
show args | 查看设置好的运行参数 | |
quit | q | 退出gdb |
symbol <filr> | sy | 导入符号表 |
info <*b> | i b | 查看程序的状态/*查看断点 |
frame | f | 查看栈帧 |
backtrace | bt | 查看堆栈情况 |
list | l | 显示源代码(debug模式) |
display | disp | 跟踪查看某个变量 |
start | s | 启动程序并中断在 |
run | r | 直接运行程序直到断点 |
continue | c | 暂停后继续执行程序 |
next | n | 单步步过 |
step | s | 单步步入 |
finish | fin | 跳出,执行到函数返回处 |
break /*<addr> | b | 下断点 |
watch | 下内存断点并监视内存情况 | |
p | 打印符号信息(debug模式) | |
i r a | 查看所有寄存器 | |
i r <esp/ebp..> | 查看某个寄存器 | |
set $esp=0x01 | 修改某个寄存器的值 | |
heap | 查看分配的chunk | |
vmmap | 查看内存分配情况 | |
bin | 查看bin情况 | |
x /<num><n/f/u> | 显示内存信息 | |
pwndbg/peda插件命令 | ||
context | 打印pwndbg信息 | |
dps <addr> | 显示内存信息 | |
disassemble <func> | 打印函数信息 | |
vmmap | 显示程序内存结构 | |
search <*argv> | 搜索内存中的值,search -h可查询用法 | |
checksec | 查看保护机制 | |
parseheap | 查看分配的chunk | |
aslr <on/off> | 打开/关闭 ASlR | |
pshow | 显示各种踏板选项和其他设置 | |
dumpargs <num> | 显示在调用指令处停止时传递给函数的参数 | |
dumprop <from> <to> | 显示特定在内存范围内的所有ROP gadget | |
elfheader | 从调试的elf文件获取头信息 | |
elfsymbol | 从ELF文件获取非调试符号信息 | |
procinfo | 显示来自/proc/pid的各种信息 | |
readelf | 从elf文件获取头信息 |
x指令的具体用法:n f u为控制打印形式的参数、、、也可以显示地址上的指令信息==?x/i
‘num’表示打印的数量
‘n’代表打印格式,可为
o | 八进制 |
---|---|
x | 十六进制 |
d | 十进制 |
u | 无符号十进制 |
t | 二进制 |
f | 浮点类型 |
a | 地址类型 |
i | 解析成命令并反编译 |
c | 字符 |
s | 字符串 |
‘f’:用来表示设定处处长度,b(byte),h(halfword),w(word),giant(8bytes)
‘u’:指定单位内存单元的字节数(默认dword),可用b(byte),h(halfword),w(word),giant(8bytes)替代
切换调试:
sudo vim ~/.gdbinit
PIE下断点:
b *$rebase(0x100)
打印结构体内容(前提结构体符号保留):
p *[结构体名称]
GDB&pwntools
#断点
gdb.attach(io,'b *'+str(rax_addr))
IDA
快捷键
快捷键 | 描述 |
---|---|
F5 | 反编译 |
x | 查看交叉引用 |
n | 重命名函数 |
shift+f12 | 查看字符串 |
G | 跳转地址 |
shift+f2 | IDA python界面 |
alt+f7 | 运行指定脚本文件 |
远程调试
在path = IDA/dbgsrv/ 中存放这各个系统架构的IDA server,将这些server传入待调试程序所在的系统,赋予执行权限,即可进行远程调试;在IDA中选择Debugger中选择remote,并填写远程调试的IP:PORT即可
提取数据
函数恢复
遇到无法识别函数==》
手动恢复:
自动恢复:IDA python
import idautils
import idc
import idaapi
import ida_search
print("脚本开始执行")
# "push ebp" 的机器码是 55
# "mov ebp, esp" 的机器码是 8B EC 或者 89 E5
patterns = [
"55 8B EC",
# 4029f9fcba1c53d86f2c59f07d5657930bd5ee64cca4c5929cbd3142484e815a
# https://malware.news/t/api-hashing-in-the-zloader-malware/40695
"55 89 E5",
]
# 遍历所有的代码段
for seg_ea in idautils.Segments():
# 获取段的名称
seg_name = idc.get_segm_name(seg_ea)
print(f"正在搜索代码段:{seg_name}")
# 检查该段是否包含指令
seg_type = idc.get_segm_attr(seg_ea, idc.SEGATTR_TYPE)
if seg_type != idaapi.SEG_CODE:
continue
# 获取段的结束地址
seg_end = idc.get_segm_end(seg_ea)
for pattern in patterns:
not_found = True # 用于跟踪是否找到目标模式
# 在该段内搜索
ea = seg_ea
while ea < seg_end:
# 使用 ida_search.find_binary 搜索组合的指令模式
ea = ida_search.find_binary(ea, seg_end, pattern, 16, idc.SEARCH_DOWN)
if ea == idaapi.BADADDR:
if not_found:
print(f"在代码段 {seg_name} 中未找到模式 {pattern}")
break # 未找到
not_found = False # 找到了目标模式
# 检查是否已经是一个函数
if idaapi.get_func(ea):
print(f"地址 0x{ea:X} 已经是一个函数,跳过")
else:
# 如果找到匹配,尝试创建函数
if not idaapi.add_func(ea):
print(f"在代码段 {seg_name} 的 0x{ea:X} 位置无法创建函数")
else:
print(f"在代码段 {seg_name} 的 0x{ea:X} 位置成功创建函数")
# 更新地址以继续搜索
ea = idc.next_head(ea, seg_end)
print("脚本执行完毕")
ADB
通信
数据包处理
捕获
wireshark
tcpdump
sudo tcpdump -i ens33 udp -w test.pcap #捕获基于ens33网卡的udp数据
Charles
https://www.charlesproxy.com/
处理
UDP数据包source IP欺骗
sudo iptables -t nat -A POSTROUTING -p udp -j SNAT --to-source [IP] #添加udp出站规则
sudo iptables -t nat -L -n -v #查看iptables所有规则
sudo iptables -t nat -D POSTROUTING -p udp -j SNAT --to-source [IP] #删除特定udp规则
pwntools
常用模块:
asm:汇编与反汇编
dynelf:远程符号泄漏
elf:elf文件泄漏
gdb:启用gdb调试
shellcraft:shellcode生成器
cyclic pattern:偏移字符计算
process/remote:读写接口
常用:
获取字符串:接口.search(‘字符串’).next()
模板:
pwncli
git clone https://github.com/RoderickChan/pwncli.git
cd ./pwncli
python3 -m pip install --editable
ROP
ROPgadget
查找寄存器:
ROPgadget --binary ELF --only '寄存器'
查找字符串:
ROPgadget --binary 文件 --string '\要找的字符串'
one_gadget
满足条件获得shell
one_gadget filename
LibcSearcher
匹配libc
puts_addr=xxxxx
libc=LibcSearcher('puts',puts_addr)
libcbase=puts_addr-libc.dump('puts')
system_addr=libcbase+libc.dump('system')
binsh=libcbase+libc.dump('str_bin_sh')
服务
deb包安装服务
sudo apt install path_to_deb_file
#或
sudo dpkg -i path_to_file
Ubuntu
ssh
sudo apt update
sudo apt install openssh-server
#安装完毕默认开启
sudo systemctl start ssh
防火墙
sudo ufw status
sudo ufw stop
sudo ufw start
虚拟环境
glibc-all-in-one
https://github.com/matrix1001/glibc-all-in-one
获取glibc:
./update_list #获取可以下载的glibc
cat list #list中存放着从./update_list获得的glibc名
./download list中出现的glibc名 #下载指定glibc,下载完的glibc放入libs中
patchelf
https://github.com/NixOS/patchelf
更换文件的glibc
例1:#改变链接器+改变搜索路径 #推荐使用1
patchelf --set-interpreter ~/glibc-all-in-one-master/libs/2.31-0ubuntu9.2_amd64/ld-2.31.so --set-rpath ~/glibc-all-in-one-master/libs/2.31-0ubuntu9.2_amd64 target_file
例2:#改变链接器+直接改变动态库的路径
patchelf --set-interpreter ~/glibc-all-in-one-master/libs/2.31-0ubuntu9.2_amd64/ld-2.31.so --replace-needed libc.so.6 ~/glibc-all-in-one-master/libs/2.31-0ubuntu9.2_amd64/libc.so.6 target_file
xclibc
https://github.com/ef4tless/xclibc
tips:需要将glibc-all-in-one放到/home/user/下
#安装
git clone https://github.com/ef4tless/xclibc.git
cd xclibc
sudo mv ./xclibc /usr/local/bin
sudo chmod +x /usr/local/bin/xclibc
#使用
xclibc [选项] [参数]
-s 查看libc文件的版本
-x 和 -c 是配置版本的主要功能
xclibc -x ./main ./libc.so.6 #读取版本自动配置
xclibc -c ./main 2.35 #根据版本配置,若版本libc > 1则可以选择其中一个进行连接
/home/ef4tless/glibc-all-in-one/libs/2.35-0ubuntu3_amd64
/home/ef4tless/glibc-all-in-one/libs/2.35-0ubuntu3.3_i386
Please specify the directory
xclibc -c ./main 2.35 /home/ef4tless/glibc-all-in-one/libs/2.35-0ubuntu3.1_i386
-r 可以恢复原本的题目状态
xclibc -r ./main
[+]restore!
Docker
Image:镜像,里面包含所要部署的应用程序以及它相关联的所有库;
Container:容器,通过镜像,可以创建多个不同的容器,每一个容器都是独立的;
Dockerfile:自动化脚本,用来创建所需要的镜像。
#获取镜像
docker pull ubuntu(镜像名)
#查看所有镜像
docker images
# 选项说明
# REPOSITORY:镜像的仓库源
# TAG:镜像的标签(版本)
# 同一个仓库源可以有多个TAG,代表这个仓库源的不同版本
# IMAGE ID:镜像ID
# CREATED:镜像创建时间
# SIZE:镜像大小
#删除镜像
docker rmi ID
#查看所有容器
docker ps -a
#删除容器
docker rm -f ID
#启动一个已经停止的容器
docker start ID
#停止一个容器
docker stop ID
#重启容器
docker restart ID
#指定容器的运行模式
#后台运行 -d参数默认不进入容器
docker run -itd --name ubuntu-test ubuntu /bin/bash
#进入容器
docker attach ID#如果从这个容器中退出,容器停止
docker exec -it ID /bin/bash#如果从这容器退出,容器不会停止(推荐使用)
#使用镜像启动容器,以命令行模式进入该容器
docker run -it ubuntu /bin/bash
#参数解析
-i:交互式操作
-t:终端
# ubuntu:ubuntu镜像
# /bin/bash:命令(此处为实现一个交互式shell)
#使用Dockerfile指令创建一个新的镜像
#需要一个Dockerfile文件,其中包含一组指令告诉Docker怎么构建镜像
docker build -t 镜像名 .
-t:指定要创建的镜像名
.:Dockerfile文件所在目录
#文件传输至容器
docker cp /本地文件路径 容器ID或容器名称:/容器内目标路径
#文件传输至镜像
docker run -v /宿主机文件的绝对路径:/容器内目标路径 -it 镜像名称
#导出本地容器
docker export ID > ubuntu.tar#导出容器快照,生成为本地文件ubuntu.rar
#导入容器
cat ubuntu.tar | docker import - test/ubuntu:v1#导入到镜像 test/ubuntu:v1:
docker import URL#通过URL或者某个目录来导入
#指定映射端口运行WBE容器
docker run -d -p 宿主机端口:容器端口 镜像 python web.py
#宿主机查看容器IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名称或ID>
#查看所有容器IP
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Qemu
安装:
sudo apt-get install qemu
sudo apt-get install qemu-user-static
sudo apt-get install qemu-system
#Install all the dependencies
sudo apt-get install libglib2.0 libglib2.0-dev
sudo apt-get install autoconf automake libtool
#Install the dependencies required by the network bridge
sudo apt-get install uml-utilities bridge-utils
使用:
#用户模式User mode
#适用于单个程序运行,例如加解密程序
#不依赖动态链接库运行
qemu-<arch>-static
cp `which qemu-<arch>-static` ./
sudo chroot ./qemu-<arch>-static [目标程序]
#依赖动态链接库
qemu-<arch>
sudo qemu-<arch> -L [libs_path] ./[目标程序]
#用户模式单程序运行例
sudo qemu-arm-static ./bin/httpd
sudo qemu-aarch64 -L . ./bin/httpd
#用户模式添加调试端口例
gdb-multiarch --args qemu-aarch64 -L . ./bin/http
sudo qemu-arm-static -g 1234 -L ./ ./bin/httpd
#系统模式System mode
#指定运行的内核或者虚拟硬盘等文件,适合整个文件系统仿真
qemu-system-arm
qemu-system-mips #大端序
qemu-system-mipsel #小端序
#mips
qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mipsel_standard.qcow2 -append "root=c/dev/sda1" -netdev tap,id=tapnet,ifname=tap0,script=no -device rtl8139,netdev=tapnet -nographic
#arm
sudo qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img-3.2.0-4-versatile -hda debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic
#采用user,端口转发模式
sudo qemu-system-arm \
-M versatilepb \
-kernel vmlinuz-3.2.0-4-versatile \
-initrd initrd.img-3.2.0-4-versatile \
-hda debian_wheezy_armel_standard.qcow2 \
-append "root=/dev/sda1" \
-net nic \
-net user,ifname=tap0,script=no,downscript=no,hostfwd=tcp::2222-:22 \
-nographic
#aarch64
镜像
获取
#清华镜像源
https://mirrors.tuna.tsinghua.edu.cn/
#debian
https://people.debian.org/~aurel32/qemu/
挂载
#创建挂载点
sudo mkdir /mnt/image
#挂载镜像文件
sudo mount -o loop /path/image.img /mnt/image
测试
ELF
checksec
检查文件保护
checksec <file> 或者
checksec –file=filename
Android
AppinfoScanner
BLE
BlueToolkit
https://github.com/sgxgsx/BlueToolkit
IOT
腾讯安全嵌入式系统安全审计平台sysAuditor
其他
文件传输
#-r为递归传输整个目录,单个文件则不需要
#本地->远程
scp [-r] [local_file_path] [username]@[remote_IP]:/remote_path
#远程->本地
scp user@remote_host:/path/to/remote/file /path/to/local/directory
Qemu-img
镜像格式转换
qemu-img convert -p -f raw xxxx.raw -O vmdk xxxx.vmdk
-p 显示转换进度
-f 原有镜像格式
-O 输出镜像格式
BinDiff
二进制对比工具
https://www.zynamics.com/software.html
安装时尽量选择安装在IDA目录中==》将会给IDA添加一个插件
在使用时首先创建工程,再在设置中选择IDA目录
分析的双方都为IDA分析后的数据文件
搜索引擎
知风
https://zhifeng.io/web/new/
fofa:
https://fofa.info/
shodan:
https://www.shodan.io/