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

  • 编译程序
  • 文件信息
  • 本地测试
  • 远程调试
  • cyclic
  • ROPgadget
  • gdb
  • pwntools

编译程序

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 文件名

查看程序防护checksec 文件名


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

查看文件头信息readelf -h 文件名

查看十六进制数据

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

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

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

检索程序导入的函数objdump -R 文件名

查看程序所有函数及反汇编objdump -d 文件名

反汇编单个函数

#!/bin/bashvmlinux=$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


反汇编整个文件ndisasm -u 文件名

查找ROPROPgadget --binary 文件名

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

本地测试

运行程序./文件名

通过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())

pwn学习总结(一) —— 常用命令相关推荐

  1. Kafka学习之四 Kafka常用命令

    2019独角兽企业重金招聘Python工程师标准>>> Kafka学习之四 Kafka常用命令 Kafka常用命令 以下是kafka常用命令行总结: 1.查看topic的详细信息 . ...

  2. 嵌入式Linux系统编程学习之二常用命令

    嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...

  3. Linux 学习笔记2 常用命令

    Linux 学习笔记1 安装linux详细教程_O丶ne丨柒夜的博客-CSDN博客 Linux_目录结构 基本介绍 1.liux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录&quo ...

  4. Maven学习文档常用命令继承聚合

    学习视频 www.atguigu.com 目前的技术在开发中存在的问题 一个项目就是一个工程 如果项目非常庞大,就不适合继续使用package来划分模块.最好是每一个模块对应一 个工程,利于分工协作. ...

  5. NodeJs学习笔记002--npm常用命令详解

    npm 常用命令详解 npm是什么 npm install 安装模块 npm uninstall 卸载模块 npm update 更新模块 npm outdated 检查模块是否已经过时 npm ls ...

  6. Docker学习笔记之常用命令

    背景 整理一下常用的Docker命令 常用命令 帮助命令 1.查看版本 $ docker versionClient: Version: 18.03.0-ce API version: 1.37 Go ...

  7. Git学习笔记:常用命令总结

    本文根据廖雪峰的博客,记录下自己的学习笔记.主要记录常用的命令,包括仓库初始化.添加文件.提交修改.新建分支.内容暂存.分支管理.标签管理等内容. git是分布式版本控制系统. 首先是安装,从官网下载 ...

  8. python学习之pip常用命令

    windows下常用pip命令 1.查看安装的所有库 2.查看pip的路径 3.pip更换镜像源 3.1临时使用 3.2永久修改 4. pip查看本地使用镜像 5.查看安装包的所有版本 6.安装指定版 ...

  9. matlab学习笔记之常用命令(一)

    一.清除命令. 1.clear all:%清除所有变量,通常在matlab的工作区:另外断点也会被清除掉 2.close all:%关闭所有窗口(除了编辑器窗口.命令窗口.帮助窗口) 3.clc;%清 ...

  10. Hadoop学习笔记——Hadoop常用命令

    Hadoop下有一些常用的命令,通过这些命令可以很方便操作Hadoop上的文件. 1.查看指定目录下的内容 语法: hadoop fs -ls 文件目录 2.打开某个已存在的文件 语法: hadoop ...

最新文章

  1. .Net 自定义应用程序配置
  2. 雅克比迭代法求方程组的解(Python实现)
  3. Makefile:条件编译
  4. Ubuntu 和 Centos 的一点差别
  5. 系统之家win11最新旗舰版64位镜像v2021.07
  6. java单位数_java – 优化代码以查找给定数量N的阶乘的单位数
  7. java怎么使两个界面联系_怎么样用java编写界面实现两个数的加法运算
  8. 使用计算机计算一个多边形,多边形面积计算器
  9. python 连续等于
  10. Tensorflow的快速安装(张量图例)
  11. 浪潮通信收入_浪潮获2019大数据“星河(Galaxy)”奖
  12. java线程池概念_Java 线程池概念、原理、简单实现
  13. linux boot 空间不足,解决Ubuntu 提示boot分区空间不足办法
  14. python的精髓_你知道Python的精髓是什么吗?是方括号、花括号和圆括号
  15. HDU 3996 Gold Mine【最大闭合权图】
  16. 【Android 逆向】加壳技术识别 ( VMP 加壳示例 | Dex2C 加壳示例 )
  17. 调试笔记:BSOD 0xA
  18. 【nexys3】【verilog】小设计——拆弹游戏
  19. 强化学习代码实操和讲解(一)
  20. CSS画卡通人物:皮卡丘

热门文章

  1. 成功解决 安装pywin32时出现python version 3.6-32 required, which was not found in the registry
  2. 成功解决​​​​​​​安装pywin32时出现python version 3.6 required, which was not found in the registry
  3. Python语言学习:Python随机生成那些事之随机生成使用方法、案例应用之详细攻略
  4. MapReduce-TextInputFormat 切片机制
  5. MySQL用source命令导入不记入binlog中【原创】
  6. 用MYSQL的存储过程创建百万级测试数据表
  7. eclipse 配置jsp
  8. 四种ASP网页跳转代码
  9. ABAP:FTP Using SAP Functions
  10. CentOS7关闭防火墙和SELinux