pwn工具

安装教程

pwntools

Linux下安装pwntools:
sudo pip3 install pwntools -i https://pypi.tuna.tsinghua.edu.cn/simple

pwndbg

1.sudo apt install gdb
2.进入gethub
3.搜pwndbg
4.对照进行安装

checksec(检查安全性保护)

ROPgadget(程序中搜索rop链片段)

one_gadget

安装路径:GitHub - bash-c/main_arena_offset: A simple shell script to get main_arena offset of a given libc
1
.sudo apt install ruby 2.gem install one_gadget

LibcSearcher

1.git clone https://github.com/lieanu/LibcSearcher.git

2.cd LibcSearcher

3.python setup.py install

4.直接运行python exp.py会提示“No module named LibcSearcher",需要将LibcSearcher.py 复制到当前目录(安装目录)。

main_arena_offset

1.shell脚本:github.com/bash-c/main_arena_offset
2.py脚本:github.com/IZAY01/py_main_arena_offset

工具介绍

IDA  /  IDA  Pro(静态分析)

1.概述>
ldd命令 用于打印程序或者库文件所依赖的共享库列表。

2.语法>

ldd(选项)(参数)

选项

--version:打印指令版本号;

-v:详细信息模式,打印所有相关信息;

-u:打印未使用的直接依赖;

-d:执行重定位和报告任何丢失的对象;

-r:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数;

--help:显示帮助信息。

文件:指定可执行程序或者文库。

3.实例>

红色标记处是一个软链接(相当于win下的快捷键)

可到/lib/x86_64-linux-gnu/目录下

命令:file libc.so.6查看链接属性

4.原理补充说明

首先ldd不是一个可执行程序,而只是一个shell脚本。

ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量。

ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道,ld- linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency。

实际上可以直接执行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program)

GDB

AMD模式改为Intel模式

set disassembly-flavor intel

命令行模式

序号 指令 举例 说明
1

i  ( r,b )

i  b 查看所有断点
2

ni

向下运行一行代码
3

si

步入 
 

ni 和 si 的区别:ni 是执行下一步函数,si 是直接进入下一步函数中

4 finish

步出
5 b  *地址

b *0x23425

在0x23425下断点
6 disable  b  断点编号

disable b 2

让断点2 失效
7

enable  b  断点编号

enable  b 3 让断点3 生效
8 d  断点编号

d  2

删除断点 2 
9 x

x / 20i  $rip

/20:打印20行代码

i :表示汇编

$rip:从 rip 的位置开始打印

 

i:汇编      b:一个byte一个byte显示       g:8个字节8个字节显示     w:4个字节4个字节显示

d:以十进制显示    x:以16进制显示    s:以字符串显示

10

set

set  *0x234=19  ; set  $rax=19;

set  {char[4]} 0x523425 = "Ace"

给地址赋值,给寄存器赋值,给字符串赋值

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

objdump

objdump 有点像那个快速查看之类的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。对于一般只想让自己程序跑起来的程序员,这个命令没有更多意义,对于想进一步了解系统的程序员,应该掌握这种工具,至少你可以自己写写shellcode了,或者看看人家给的 exploit 中的 shellcode 是什么东西。

常用命令选项:

objdump -D -b binary -m i386 [file]

-D表示对全部文件进行反汇编;

-b表示二进制;

-m表示指令集架构;

file就是我们要反汇编的二进制文件;

同时我们也可以指定big-endian或little-endian(-EB或-EL);

objdump -f [file] *显示file的文件头信息;

objdump -t file *输出目标文件的符号表;

objdump -h file *显示file的Section Header信息;

objdump -x file 显示file的全部Header信息;

-S file *输出目标文件的符号表, 当gcc -g时打印更明显;[S大写]

-s file 除了显示file的全部Header信息,还显示他们对应的十六进制文件代码;

-d file *反汇编file中的需要执行指令的那些section;

-D file 与-d类似,但反汇编file中的所有section;

-R *显示动态链接重定位信息;

-r 显示重定位信息;

objdump -s libc.so>test.txt 输出到txt文件

查看PLT表

objdump -d -j .plt file

查看GOT表

objdump -R file

注:*号的一帮经常用。

readelf

1.概述>

readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件。

2.常用参数>

语法:readelf (选项)(file)

-h (elf header),显示elf文件开始的文件头信息。

-l (program headers),segments 显示程序头(段头)信息(如果有数据的话)。

-S (section headers),sections 显示节头信息(如果有数据的话)。

-g (section groups),显示节组信息(如果有数据的话)。

-s (symbols) 显示符号表段中的项(如果有数据的话)。

-e headers 显示全部头信息,等价于: -h -l -S 。

-r relocs 显示可重定位段的信息。

-d dynamic 显示动态段的信息。

-V version-info 显示版本段的信息。

附:命令参数参考:GNU Binary Utilities(英文版)

 

ROPgadget

概述:查找文件中一些需要的指令和字符串等。

安装:sudo apt-get install python-capstone
  python setup.py install
命令:ROPgadget
-h
常用命令 ROPgadget
--binary [file] --string [...] //后面根据需要自己补充,如下另一个使用例子 ROPgadget --binary 文件名 --only "pop|ret" | grep rdi

GCC

工具篇_GCC
补充常用保护相关参数
-no-pie:关闭地址随机化
-fno-stack-protector:关闭堆栈保护
-z execstack:堆栈可执行
-m32: 生成32位文件

 

posted @ 2023-01-05 22:40  白榆-  阅读(193)  评论(0)    收藏  举报