工具与命令
2099-06-18 00:00:00

工具使用(长期更新):

编程开发

环境变量设置

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 下内存断点并监视内存情况
print 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 *[结构体名称]

image-20240708101548884

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即可

image-20231023232824191

提取数据

函数恢复

遇到无法识别函数==》

手动恢复:

image-20240818225041635

自动恢复: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/

上一页
2099-06-18 00:00:00