pwn入门——2.工具基本使用

十念  金牌会员 | 2024-12-2 19:04:17 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 990|帖子 990|积分 2970

0x00 IDA pro

1. 两个版本

ida pro安装完成之后&#xff0c
;会生成两个快捷方式&#xff0c
;一个是ida pro(32-bit)一个是ida pro(64-bit)&#xff0c
;分别对应32位和64位步伐
2. 分析步伐

将文件拖动到ida中即可分析步伐
常用快捷键

空格是看汇编
重命名 n
切换标签 tab
反编译F5
看汇编 空格
看字符串 shift + F12 &#xff0c
;
看各个段的位置 c
trl + s
查看反编译函数:tab/F5
查看字符串窗口:shift + F12
跳转到指定地址:G
追踪函数(交叉引用):X
剖析成字符:R
反汇编窗口切换文本跟图形:spac
e
重命名函数:N
退回到上个操作:esc

0x01 GDB

加载分析步伐

[c
ode]gdb ./ret2text
[/c
ode] 退出gdb

[c
ode]q
[/c
ode] 运行步伐

[c
ode]r / run
[/c
ode] 停止运行

[c
ode]c
trl + c

[/c
ode] 继续运行

[c
ode]c
[/c
ode] 下断点

[c
ode]b 函数名
b *函数地址
[/c
ode] ​b func
tion/b *addr​​​
单步步入:
单步执行

[c
ode]ni #单步步过
si #单步步入
fini
sh # 步出
[/c
ode]
计算器

[c
ode]p/d
[/c
ode] 查看当前函数汇编

[c
ode]disass
[/c
ode] 停止调试

[c
ode]gdb.attac
h(p)[/c
ode] 退出当前函数

[c
ode]fini
[/c
ode] 查看当前文件权限

[c
ode]vmmap
[/c
ode] 查看栈布局

[c
ode]satc
k 巨细[/c
ode] 查看堆布局

[c
ode]heap
[/c
ode] 查看指定内存地址

[c
ode]x/40gx 地址
[/c
ode] 0x02 Pwntools

pwntools先容

Pwntools是一个CTF框架和漏洞利用开发库&#xff0c
;用Python开发&#xff0c
;旨在让使用者简单快速的编写exploit。
险些涵盖了做pwn标题脚本所须要用到的各种工具。
导入pwntools

[c
ode]from pwn import *
[/c
ode] 建立连接

建立连接对于解pwn题尤为告急&#xff0c
;比赛时&#xff0c
;一般会给你一个pwn标题文件(一般是linux elf文件)&#xff0c
;还会给你一个nc
地址。


  • elf文件用于本地调试&#xff0c
    ;发现漏洞
  • nc
    地址用于攻击&#xff0c
    ;获取flag
因此&#xff0c
;我们须要与nc
服务器和elf文件建立连接。
与步伐文件建立连接

我们可以利用pwnlib.elf模块来连接步伐文件。
[c
ode]r = proc
ess('./bin')                        #本地创建历程&#xff0c
;本地调试elf = ELF('./proc
ess')                         #proc
ess为标题给出的步伐文件[/c
ode] 与服务器建立连接

我们通过pwnlib.tubes模块来连接服务器
[c
ode]r = remote('ip',port) #在对应位置填入题目给出的ip和端口
[/c
ode] 设置目标架构和操作体系

我们可以通过设置目标架构和操作体系&#xff0c
;来告诉pwntools我们步伐的运行环境&#xff0c
;pwntools会自动帮我们调解对应的编译格式和字节序。
[c
ode]c
ontext.arc
h = 'i386'                                 #32位步伐设置为i386;64位步伐设置为amd64,如果已经导入elf文件&#xff0c
;可以写成c
ontext.arc
h = elf.arc
hc
ontext.binary = './proc
ess'                         #可以用这种方法自动设置成得当的值c
ontext.os = 'linux'                                #设置体系信息c
ontext.log_level = 'debug'                         #可在屏幕上打印debug信息c
ontext.terminal = ['tmux', 'splitw', '-h']         #告诉pwntools你的终端信息&#xff0c
;方便后期动态调试c
ontext.terminal = ['gnome-terminal', '-x', 'sh', '-c
']c
ontext.terminal = ['ssh', '-x', 'sh', '-c
']c
ontext.endian = 'big'                                 #设置字节序为大端序&#xff0c
;小端序设置为little[/c
ode] 交互

在了解了上述的一些预备工作之后&#xff0c
;我们可以尝试开始和步伐举行交互了。
接收数据

[c
ode]r.rec
v()                 #接收数据r.rec
vline()                 #接收一行数据r.rec
vall()                 #接收数据&#xff0c
;直到到达EOF[/c
ode] 发送数据

[c
ode]r.send()                                 #发送数据r.sendline()                                 #发送一行数据r.sendlineafter('str',payload)                 #当接收到指定命据时&#xff0c
;发送数据[/c
ode] shell交互

[c
ode]r.interac
tive()[/c
ode] 获取函数地址

当我们成功连接到步伐文件时&#xff0c
;我们可以利用pwntools快速获取函数地址。
例如获取puts函数地址:
[c
ode]puts_got_addr = elf.got['puts'] #获取puts函数got表地址
puts_plt_addr = elf.plt['puts'] #获取puts函数plt表地址
puts_sym_addr = elf.symbols['puts'] #获取puts函数符号表地址
[/c
ode] shellc
raft


我们做题时&#xff0c
;会常常用到shellc
ode&#xff0c
;但是每次都从网上找对应的shellc
ode会大大低落我们的做题效率。shellc
raft模块可以帮我们自动生成shellc
ode。
[c
ode]shellc
raft.sh()[/c
ode] 打包解包&汇编

在我们发送和接收数据时&#xff0c
;会常常使用打包解包操作。
[c
ode]p32() #将数据打包成32位二进制格式&#xff0c
;字节序由c
ontext.endian设置p64() #将数据打包成64位二进制格式&#xff0c
;字节序由c
ontext.endian设置u32() #将32位二进制格式数据解包u64() #将64位二进制格式数据解包[/c
ode] 有时我们也会用到汇编操作&#xff0c
;例如我们要发送shellc
ode:
[c
ode]shellc
ode = asm(shellc
raft.sh())r.sendline(shellc
ode)[/c
ode] 0x03 one_gadget

Github:GitHub - david942j/one_gadget: The best tool for finding one gadget RCE in libc
.so.6
1. 支持架构:



  • i386
  • amd64 (x86-64)
  • aarc
    h64 (ARMv8)
2. 用法

[c
ode]$ one_gadget# Usage: one_gadget <FILE|-b BuildID> [options]#     -b, --build-id BuildID           BuildID[sha1] of libc
.#     -f, --[no-]forc
e-file            Forc
e searc
h gadgets in file instead of build id first.#     -l, --level OUTPUT_LEVEL         The output level.#                                      OneGadget automatic
ally selec
ts gadgets with higher suc
c
essful probability.#                                      Inc
rease this level to ask OneGadget show more gadgets it found.#                                      Default: 0#     -n, --near FUNCTIONS/FILE        Order gadgets by their distanc
e to the given func
tions or to the GOT func
tions of the given file.#     -r, --[no-]raw                   Output gadgets offset only, split with one spac
e.#     -s, --sc
ript exploit-sc
ript      Run exploit sc
ript with all possible gadgets.#                                      The sc
ript will be run as 'exploit-sc
ript $offset'.#         --info BuildID               Show version information given BuildID.#         --base BASE_ADDRESS          The base address of libc
.#                                      Default: 0#         --version                    Current gem version.#eg one_gadget libc
.so[/c
ode] [c
ode]root@ubuntu:~/pwn$ one_gadget libc
-2.23.so0x45216 exec
ve("/bin/sh", rsp+0x30, environ)c
onstraints:  rax == NULL0x4526a exec
ve("/bin/sh", rsp+0x30, environ)c
onstraints:  [rsp+0x30] == NULL0xf0274 exec
ve("/bin/sh", rsp+0x50, environ)c
onstraints:  [rsp+0x50] == NULL0xf1117 exec
ve("/bin/sh", rsp+0x70, environ)c
onstraints:  [rsp+0x70] == NULL[/c
ode] 0x04 c
hec
ksec


1. 用法

查抄保护机制
[c
ode]$ c
hec
ksec
./pwn[/c
ode] 0x05 ROPgadget

Github:GitHub - JonathanSalwan/ROPgadget: This tool lets you searc
h your gadgets on your binaries to fac
ilitate your ROP exploitation. ROPgadget supports ELF, PE and Mac
h-O format on x86, x64, ARM, ARM64, PowerPC, SPARC, MIPS, RISC-V 64, and RISC-V Compressed arc
hitec
tures.
1. 用法

[c
ode]usage: ROPgadget.py [-h] [-v] [-c
] [--binary <binary>] [--opc
ode <opc
odes>]                    [--string <string>] [--memstr <string>] [--depth <nbyte>]                    [--only <key>] [--filter <key>] [--range <start-end>]                    [--badbytes <byte>] [--rawArc
h <arc
h>] [--rawMode <mode>]                    [--rawEndian <endian>] [--re <re>] [--offset <hexaddr>]                    [--ropc
hain] [--thumb] [--c
onsole] [--norop] [--nojop]                    [--c
allPrec
eded] [--nosys] [--multibr] [--all] [--noinstr]                    [--dump] [--silent] [--align ALIGN] [--mipsrop <rtype>]desc
ription:  ROPgadget lets you searc
h your gadgets on a binary. It supports several  file formats and arc
hitec
tures and uses the Capstone disass
embler for  the searc
h engine.formats supported:  - ELF  - PE  - Mac
h-O  - Rawarc
hitec
tures supported:  - x86  - x86-64  - ARM  - ARM64  - MIPS  - PowerPC  - Sparc
optional arguments:  -h, --help            show this help message and exit  -v, --version         Display the ROPgadget's version  -c
, --c
hec
kUpdate     Chec
ks if a new version is available  --binary <binary>     Spec
ify a binary filename to analyze  --opc
ode <opc
odes>    Searc
h opc
ode in exec
utable segment  --string <string>     Searc
h string in readable segment  --memstr <string>     Searc
h eac
h byte in all readable segment  --depth <nbyte>       Depth for searc
h engine (default 10)  --only <key>          Only show spec
ific
instruc
tions  --filter <key>        Suppress spec
ific
mnemonic
s  --range <start-end>   Searc
h between two addresses (0x...-0x...)  --badbytes <byte>     Rejec
ts spec
ific
bytes in the gadget's address  --rawArc
h <arc
h>      Spec
ify an arc
h for a raw file                        x86|arm|arm64|sparc
|mips|ppc
  --rawMode <mode>      Spec
ify a mode for a raw file 32|64|arm|thumb  --rawEndian <endian>  Spec
ify an endianness for a raw file little|big  --re <re>             Regular expression  --offset <hexaddr>    Spec
ify an offset for gadget addresses  --ropc
hain            Enable the ROP c
hain generation  --thumb               Use the thumb mode for the searc
h engine (ARM only)  --c
onsole             Use an interac
tive c
onsole for searc
h engine  --norop               Disable ROP searc
h engine  --nojop               Disable JOP searc
h engine  --c
allPrec
eded        Only show gadgets whic
h are c
all-prec
eded  --nosys               Disable SYS searc
h engine  --multibr             Enable multiple branc
h gadgets  --all                 Disables the removal of duplic
ate gadgets  --noinstr             Disable the gadget instruc
tions c
onsole printing  --dump                Outputs the gadget bytes  --silent              Disables printing of gadgets during analysis  --align ALIGN         Align gadgets addresses (in bytes)  --mipsrop <rtype>     MIPS useful gadgets finder                        stac
kfinder|system|tails|lia0|registersexamples:  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --ropc
hain  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --depth 3  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --string "main"  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --string "m..n"  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --opc
ode c
9c
3  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --only "mov|ret"  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --only "mov|pop|xor|ret"  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --filter "xc
hg|add|sub|c
mov.*"  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --norop --nosys  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --range 0x08041000-0x08042000  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --string main --range 0x080c
9aaa-0x080c
9aba  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --memstr "/bin/sh"  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --c
onsole  ROPgadget.py --binary ./test-suite-binaries/elf-Linux-x86 --badbytes "00|01-1f|7f|42"  ROPgadget.py --binary ./test-suite-binaries/Linux_lib64.so --offset 0xdeadbeef00000000  ROPgadget.py --binary ./test-suite-binaries/elf-ARMv7-ls --depth 5  ROPgadget.py --binary ./test-suite-binaries/elf-ARM64-bash --depth 5  ROPgadget.py --binary ./test-suite-binaries/raw-x86.raw --rawArc
h=x86 --rawMode=32[/c
ode] 0x06 Libc
Searc
her


Github:GitHub - lieanu/Libc
Searc
her: glibc
offset searc
h for c
tf.
1. 简介

这是针对CTF比赛所做的小工具&#xff0c
;在泄露了Libc
中的某一个函数地址后&#xff0c
;常常为不知道对方所使用的操作体系及libc
的版本而苦恼&#xff0c
;常规方法就是挨个把常见的Libc
.so从体系里拿出来&#xff0c
;与泄露的地址对比一下最后12位。
2. 安装

[c
ode]git c
lone https://github.c
om/lieanu/Libc
Searc
her.gitc
d Libc
Searc
herpython setup.py develop[/c
ode] 3. 用法

[c
ode]from Libc
Searc
her import *#第二个参数&#xff0c
;为已泄露的现实地址,或最后12位(比如:d90)&#xff0c
;int类型libc
= Libc
Searc
her("fgets", 0X7ff39014bd90)libc
.dump("system")        #system 偏移libc
.dump("str_bin_sh")    #/bin/sh 偏移libc
.dump("__libc
_start_main_ret")  [/c
ode] 注:如遇到无法找到对应libc
库的情况&#xff0c
;可以使用在线的查找工具
http://game2.eric
dshen.c
om:31337/
0x07 GCC编译

<bloc
kq
uote id="20230927084539-t3nfc
i7">  下令参数

  1.关掉DEP/NX(堆栈不可执行)

  [c
ode]gc
c
-z exec
stac
k -o level level.c
[/c
ode]  2.关掉Stac
k Protec
tor/Canary(栈保护)


  [c
ode]gc
c
-fno-stac
k-protec
tor -o level level.c
[/c
ode]  3.关掉/开启步伐ASLR/PIE(步伐随机化保护)

  [c
ode]gc
c
-no-pie level level.c
gc
c
-pie level level.c
[/c
ode]  4.关闭/开启整个linux体系的ASLR保护

  [c
ode]sudo -s ec
ho 0 > /proc
/sys/kernel/randomize_va_spac
e exitsudo -s ec
ho 2 > /proc
/sys/kernel/randomize_va_spac
e[/c
ode]  5.64位linux下面的GCC编译出一个32位可执行步伐

  [c
ode]#加参数 -m32gc
c
-m32 -z exec
stac
k -fno-stac
k-protec
tor -o level level.c
[/c
ode]  6.关闭所有保护

  [c
ode]gc
c
-z exec
stac
k -fno-stac
k-protec
tor -no-pie -o level level.c
[/c
ode]  0x08 常用下令

1. file下令

查看文件类型
[c
ode]$ file ./pwn
[/c
ode] 2. ldd下令

查看库
[c
ode]$ ldd ./pwn
[/c
ode] 3. objdump下令

反汇编
[c
ode]$ objdump -d -M intel ./pwn
[/c
ode] [c
ode]def dbg():        gdb.attac
h(r)        pause()[/c
ode] ​在须要调试的地方插入dbg(),如果我们之前在c
ontext.terminal中设置好终端类型&#xff0c
;会自动帮我们开启新的终端窗口并打开gdb调试。​
查看文件在硬盘中的布局

[c
ode]objdump -s elf
[/c
ode]
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:q
idao123.c
om:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表