pwn学习总结(一) —— 常用命令

编译程序

GCC编译参数
-m32:编译为32位程序
-fstack-protector:启用栈溢出保护,不过只为局部变量中含有数组的函数插入保护
-fstack-protector-all:启用栈溢出保护,为所有函数插入保护
-fno-stack-protector:禁用栈溢出保护
-z noexecstack:开启NX保护
-z execstack:关闭NX保护
-z norelro:关闭relro
-z lazy:开启relro,等级为1
-z now:开启relro,等级为2
-fpie -pie:开启pie,此时强度为1
-fPIE -pie:开启pie,此时最高强度为2
-no-pie:关闭pie

文件信息

查看文件属性file 文件名
file
查看程序防护checksec 文件名

checksec
Arch:文件属性
RELRO:开启后,符号重定向表格属性为只读,或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击,图中Partial RELRO表示我们对GOT表具有写的权限
Stack:Canary Stack保护(俗称金丝雀),开启后,程序在函数返回前会设置好的金丝雀值进行检查,从而达到堆栈保护的目的
NX:即No-eXecute(不可执行)的意思,开启后,就算溢出到shellcode位置也不可执行,cpu会抛出异常
PIE:地址随机化

查看文件头信息readelf -h 文件名
readelf
查看十六进制数据

  1. 完整显示:xxd 文件名 | od -A x -t x1z 文件名

  2. 部分显示:od --skip bytes=偏移地址 --read-bytes=字节数 -A x -t x1z 文件名

    x1z表示每显示一个十六进制数输出一个空格;x2z表示每显示两个十六进制数输出一个空格*

    od

检索程序导入的函数objdump -R 文件名
objdump
查看程序所有函数及反汇编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

objdump.sh
反汇编整个文件ndisasm -u 文件名

查找ROPROPgadget --binary 文件名

过滤ROPROPgadget --binary 文件名 --only '指令1|指令2'
ROPgadget

本地测试

运行程序./文件名

通过python构造payloadpython -c 'print "payload"' | ./文件名

将文件内容作为输入cat payload文件 -| ./文件名

远程调试

连接远程服务器nc ip port

下载远程目录中的程序scp -P 端口号 -p IP地址:路径/* ./

cyclic

生成字符串队列cyclic 字符数

计算字符串偏移cyclic -l 四个字母

ROPgadget

搜索ROP指令ROPgadget --binary 文件名 --only '指令1|指令2' | grep '需包含的字符串'

自动生成ROP链(若存在),只适用于静态链接程序ROPgadget --binary 文件名 --ropchain

gdb

安装pwndbg插件

git clone https://github.com/pwndbg/pwndbg
cd pwndbg
sudo ./setup.sh

选择文件

  1. gdb 文件名
  2. gdb ; file 文件名

附加进程attach 进程ID

运行run

将文件数据作为运行参数run < file

运行至程序入口start

单步步入si

单步步过ni

在指定函数设置断点b 函数名

在指定地址设置断点b *地址

继续运行程序continue | c

查看所有寄存器的值reg

查看指定寄存器的值p $寄存器代号

查看内存布局i proc mappings

查看内存数据

  1. 以反汇编形式查看数据x/[字节数]i 地址
  2. 以32位十六进制形式查看数据x/[字节数]wx 地址
  3. 以64位十六进制形式查看数据x/[字节数]gx 地址

查看函数调用情况backtrace | bt

查看栈数据stack

查看所有函数定义i functions

查看指定函数反汇编代码disassemble 函数名

查看当前函数反汇编代码disassemble $pc

查看libc动态地址libc

查找字符串所在地址search '字符串'

pwntools

安装pwntoolspip install pwntools

导入pwntoolsfrom pwn import *

输出调试信息context.log_level = 'debug'

设置cpu架构context.arch = 'i386'/'amd64'

远程连接sh = remote('IP',PORT)

本地运行sh = process('./elf')

发送数据sh.send(data)

发送数据,并在末尾加上换行符(\n)sh.sendline(data)

在指定字符出现后输入指定字符串sh.sendafter('等待的字符串', '输入的字符串')

在指定字符出现后输入指定字符串与回车sh.sendlineafter('等待的字符串', '输入的字符串')

接收数据,numb指定字节数,timeout指定超时时间sh.recv(numb=4096, timeout=default)

接收一行数据,keepends表示是否保留行尾的换行符(\n)sh.recvline(keepends=True)

一直接收到字符串delims出现,drop表示是否保留参数1sh.recvuntil(delims, drop=False)

一直接收数据直到EOFsh.recvall()

进入shell模式sh.interactive()

附加gdb调试gdb.attach(sh)

加载elf文件elf = ELF('[文件名]')

查看指定函数的PLT地址function_plt = elf.plt['函数名']

定位字符串静态偏移elf.search('字符串').next()

将整数转换成32位的小端字节序p32(整数)

将4个字节转换成最多4字节的整数u32(字符串.ljust(4, '\x00'))

将整数转换成64位的小端字节序p64(整数)

将8个字节转换成最多8字节的整数u64(字符串.ljust(8, '\x00'))

生成指定字符数量的字符串str = cyclic(字符数)

查找指定字符串偏移index = cyclic_find('四个字母')

生成一段shellcode汇编代码shellcode = shellcraft.sh()

编译shellcode汇编代码为字节码shellcode = asm(shellcraft.sh())

  • 7
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!很高兴回答你的问题。关于软件安全实验二的攻击方式Pwn,我可以为你提供一些基本的信息。Pwn是指通过利用软件漏洞来获取对计算机系统的控制权。在实验二,你可能会学习和尝试使用缓冲区溢出漏洞、格式化字符串漏洞、堆溢出等技术来进行Pwn攻击。 缓冲区溢出是一种常见的Pwn攻击技术,它利用了程序在处理输入数据时没有正确限制长度的漏洞。通过向程序输入过长的数据,可以覆盖到程序运行时的内存空间的其他重要数据,例如返回地址。通过修改返回地址,攻击者可以控制程序流程,执行恶意代码。 格式化字符串漏洞是另一种常见的Pwn攻击技术。它利用了C语言的格式化字符串函数(如printf、sprintf等)在处理格式化字符串时存在的安全问题。通过向程序输入特定格式的字符串,攻击者可以读取或修改内存的数据,甚至执行任意代码。 堆溢出是利用堆内存管理的漏洞进行攻击的一种技术。在使用动态分配内存时,如果没有正确地释放或管理内存,可能会导致堆溢出。通过在堆溢出写入数据,攻击者可以修改关键数据结构,从而影响程序的执行逻辑。 以上只是Pwn攻击的一些基本概念,实际的Pwn攻击还涉及很多技术和细节。在进行任何Pwn攻击之前,请务必遵循法律和道德规范,并确保你在合法授权的环境进行实验。 如果你有任何关于Pwn攻击或软件安全实验的具体问题,我会尽力为你解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值