0x00 前言

2023.8.15 夜里

非常欢迎使用我的魔刀千刃,并且欢迎各位师傅对我的开源代码进行指导!

—–Offense without defense,

    unparalleled in the world.—–
Welcome to the universe of N1nEmAn. To find detailed usage instructions for evilblade, please visit cnblogs.com/9man.

访问连接:https://pypi.org/project/evilblade/

0x01 安装

安装直接如下命令。

pip3 install evilblade

本包还依赖包LibcSearcher和pwntools,如未安装,请安装。

pip3 install pwntools
pip3 install LibcSearcher

0x02 内置帮助

为了兼容问题内置帮助我没有写中文,在这里写中文版本的。

内置帮助命令:python -m pydoc evilblade,按q退出。

0x03 中文帮助

    dp(name, data)
# 数据打印 dpx(name, data)
# 数据以十六进制格式打印 evgdb(*argv)
# 设置 gdb,也称为 evil-gdb
# 如果需要设置断点,请将 'b address/defname' 作为参数。 fmt(offset, begin, end, size, written)
# 用于格式化字符串漏洞,但实用性不高。 getbase(add, defname, *args)
# 计算 libc 的基地址。"add" 是泄露的地址,"defname" 是库函数名,"*args" 是需要减去的额外偏移量。 getd(i, j)
# 用于十进制格式
# 类似于 getx32 getx(i, j)
# 用于十六进制格式
# 类似于 getx32 getx32(i, j)
# 用于 32 位
# 在使用 tet() 测试过的 '\xff' 格式之后,你可以接收地址。
# "i" 参数表示接收数据的开头,"j" 表示结尾。
# 通常 "i" 设置为 0,"j" 设置为 -1。
# 不断修改 "i" 和 "j" 的值,直到获得满意的结果为止。 getx64(i, j)
# 用于 64 位
# 类似于 getx32 gotadd(defname, *args)
# 没有 PIE 保护,如果参数只有 "defname",得到 GOT 表地址。
# 有 PIE 保护,如果参数只有 "defname",得到 GOT 表地址偏移。加上第二个参数作为基地址,得到实际 GOT 表地址。 ia lambda (...)
# 启动交互式 shell libset(libc_val)
# 设置你的 libc,也称为 libc-set n2b lambda x
# 将数字转换为字节 pltadd(defname, *args)
# 类似于 gotadd,但获取的是 PLT 表的地址 rgetbase(add, defname, *args)
# 类似于 'getbase',但用于远程 libc 库 rl lambda (...)
# 接收一行数据,相当于 p.recvline() rlibset(defname, add)
# 设置远程 libc 库。 rop lambda r
# 将值列表转换为 ROP 链(64 位) rsetup(mip, mport)
# 建立远程连接 rsymoff(defname, *args)
# 类似于 'symoff',但用于远程 libc 库 ru lambda s
# 接收数据,直到特定字符串,相当于 p.recvuntil(s) rv lambda x
# 接收数据,相当于 p.recv(x) sa lambda t, s
# 在特定字符串后发送数据,相当于 p.sendafter(t, s) sd lambda s
# 发送数据,相当于 p.send(s) setup(p_val)
# 设置你的进程和 ELF sl lambda s
# 发送带有 '\n' 的数据,相当于 p.sendline(s) sla lambda t, s
# 在特定字符串后发送一行数据,相当于 p.sendlineafter(t, s) sn lambda n
# 发送一个带有 '\n' 的数字,相当于 sl(n2b(n)) sna lambda t, n
# 在特定字符串后发送一个数字,相当于 sla(t, n2b(n)) symadd(defname, *args)
# 类似于 gotadd,但获取的是 SYM 表的地址 symoff(defname, *args)
# 如果参数只有 'defname',你会得到偏移量。
# 如果有第二个参数作为基地址,你会得到函数的实际地址。 terset(get)
# 如果你不能直接运行 GDB,请根据情况使用 'terset' 来设置终端。使用 'echo $TERM' 的输出作为参数。 tet()
# 接收一行数据,并将其显示给你 uu64 lambda data
# 从字节中解包一个 64 位无符号整数

0x02 开源代码

from pwn import *
from LibcSearcher import * '''
明知道是陷阱,
为什么还要来。
'''
# Convert a number to bytes
n2b = lambda x: str(x).encode() # Receive data, equivalent to p.recv(x)
rv = lambda x: p.recv(x) # Receive a line of data, equivalent to p.recvline()
rl = lambda: p.recvline() # Receive data until a specific string, equivalent to p.recvuntil(s)
ru = lambda s: p.recvuntil(s) # Send data, equivalent to p.send(s)
sd = lambda s: p.send(s) # Send data with '\n', equivalent to p.sendline(s)
sl = lambda s: p.sendline(s) # Send a number with '\n', equivalent to sl(n2b(n))
sn = lambda n: sl(n2b(n)) # Send data after a specific string, equivalent to p.sendafter(t, s)
sa = lambda t, s: p.sendafter(t, s) # Send a line of data after a specific string, equivalent to p.sendlineafter(t, s)
sla = lambda t, s: p.sendlineafter(t, s) # Send a number after a specific string, equivalent to sla(t,n2b(n))
sna = lambda t, n: sla(t, n2b(n)) # Start an interactive shell
ia = lambda: p.interactive() # Convert a list of values to a ROP chain (64-bit)
rop = lambda r: flat([p64(x) for x in r]) # Unpack a 64-bit unsigned integer from bytes
uu64 = lambda data: u64(data.ljust(8, b'\x00')) ##Set your libc, aka libc-set
def libset(libc_val):
global libc
libc = ELF(libc_val) #Set your prosecc and ELF
def setup(p_val):
global p
global elf
p = process(p_val)
elf = ELF(p_val)
#Establish remote connection
def rsetup(mip, mport):#设置远程连接 remote setup
if args.P:
global p
p = remote(mip,mport)
##Recieve a line of data, and show it for you
def tet():
#test,测试接收数据
p = globals()['p']
r = ru('\n')
print('\n----------------\n','add','is >>> ',r,'\n---------------')
return r #For 64-bit
#Just like getx32
def getx64(i,j):
if i != 0:
r = (ru('\n'))[i:j]
dp('getx64',r)
r = u64(r.ljust(8,b'\0'))
print('\n----------------\n','add','is >>> ',hex(r),'\n---------------')
return r
else:
r = (ru('\n'))[:j]
dp('getx64',r)
r = u64(r.ljust(8,b'\0'))
print('\n----------------\n','add','is >>> ',hex(r),'\n---------------')
return r #For 32-bit
#After testing with tet(), addresses can be received for the '\xff' format.
#The 'i' parameter represents the start of the received data, while 'j' indicates the end.
#Usually, 'i' is set to 0, and 'j' is set to -1.
#Continuously adjust the values of 'i' and 'j' until you obtain the desired result.
def getx32(i,j):
if i != 0:
r = (ru('\n'))[i:j]
dp('getx32',r)
r = u32(r.ljust(4,b'\0'))
print('\n----------------\n','add','is >>> ',hex(r),'\n---------------')
return r
else:
r = (ru('\n'))[:j]
dp('getx32',r)
r = u32(r.ljust(4,b'\0'))
print('\n----------------\n','add','is >>> ',hex(r),'\n---------------')
return r #For the hex format
#Just like getx32
def getx(i,j):
if i != 0:
r = (ru('\n'))[i:j]
dp('geti',r)
r = int(r,16)
print('\n----------------\n','add','is >>> ',hex(r),'\n---------------')
return r
else:
r = (ru('\n'))[:j]
dp('geti',r)
r = int(r,16)
print('\n----------------\n','add','is >>> ',hex(r),'\n---------------')
return r #For the decimal format
#Just like getx32
def getd(i,j):
if i != 0:
r = (ru('\n'))[i:j]
dp('geti',r)
r = int(r,10)
print('\n----------------\n','add','is >>> ',hex(r),'\n---------------')
return r
else:
r = (ru('\n'))[:j]
dp('geti',r)
r = int(r,10)
print('\n----------------\n','add','is >>> ',hex(r),'\n---------------')
return r '''
只攻不防,
天下无双—————
魔刀千刃。
'''
##计算世界 #Calculate the base address of libc. "add" is the leaked address, "defname" is the library function name, and "*args" are the excess offsets that need to be subtracted.
def getbase(add,defname,*args):
#计算libcbase,args作为多余参数相减 get libcbase
base = add - libc.sym[defname]
for num in args:
base -= num
print('\nloading...')
print('\n----------------\nget!your base is >>> ',hex(base),'\n--------------')
return base ter = 'NULL'
#If you are unable to directly run GDB, please use the 'terset' to set the terminal according to your situation. Use the output of 'echo $TERM' as the parameter.
def terset(get):
global ter
dp('ter',ter)
#Set gdb,aka evil-gdb
#If you need to set a breakpoint, please use 'b address/defname' as the parameter.
def evgdb(*argv):
p = globals()['p']
ter = globals()['ter']
#获取全局变量值
dp('gdbter',ter)
if ter!='NULL':
context.terminal = [ter, '-e']
if args.G:
if(len(argv)==0):
gdb.attach(p)
else:
gdb.attach(p,argv[0])
#If the parameter is only 'defname', you will get the offset.
#If there's a second parameter as the base address, you will get the actual address of the function.
def symoff(defname,*args):#计算或者设置偏移symbol's offset
if(len(args)>0):
ba = args[0]
print('\n----------------\nyour ',defname,'offset is >>> ',hex(libc.sym[defname]),'\n---------------')
print('\n----------------\nyour ',defname,'is in >>> ',hex(ba+libc.sym[defname]),'\n---------------')
return libc.sym[defname]+ba
else:
print('\n---------------\nyour ',defname,'offset is >>> ',hex(libc.sym[defname]),'\n---------------')
return libc.sym[defname]
#Without PIE, if only "defname", obtain the address of the GOT table.
#With PIE, if only "defname", obtain the offset of the GOT table. Adding the second parameter as the base address will give you the actual GOT table address.
def gotadd(defname,*args):#获取got表地址got'sadd
if (len(args) > 0):
return elf.got[defname]+args[0]#有pie的时候
return elf.got[defname]
#Jusr like gotadd,but obtain the address of the PLT table
def pltadd(defname,*args):#获取got表地址got'sadd
if (len(args) > 0):
return elf.plt[defname]+args[0]#有pie的时候
return elf.plt[defname] #Just like gotadd,but obtain the address of the SYM table
def symadd(defname,*args):#获取got表地址got'sadd
if (len(args) > 0):
return elf.sym[defname]+args[0]#有pie的时候
return elf.sym[defname]
#Data print
def dp(name,data):#打印数值data print
print('\n---------------\nyour ',name,' is >>> ',(data),'\n---------------')
#Data print as hex
def dpx(name,data):#hex打印数值data print
print('\n---------------\nyour ',name,' is >>> ',hex(data),'\n---------------') '''
因为,
我有想要保护的人。
''' ##查库世界 #Set the remote libc library.
def rlibset(defname,add):
#远程libc设置
global rlibc
rlibc = LibcSearcher(defname, add) #Just like 'getbase', but for remote libc library
def rgetbase(add,defname,*args):
#计算远程libcbase,args作为多余参数相减 get libcbase
base = add - rlibc.dump(defname)
for num in args:
base -= num
print('\nloading...')
print('\n----------------\nget!your base is >>> ',hex(base),'\n--------------')
return base
#Just like 'symoff',but for remote libc library
def rsymoff(defname,*args):#计算或者设置偏移symblol's offset
if(len(args)>0):
ba = args[0]
print('\n----------------\nyour ',defname,'offset is >>> ',hex(rlibc.dump(defname)),'\n---------------')
print('\n----------------\nyour ',defname,'is in >>> ',hex(ba+rlibc.dump(defname)),'\n---------------')
return rlibc.dump(defname)+ba
else:
print('\n---------------\nyour ',defname,'offset is >>> ',hex(rlibc.dump(defname)),'\n---------------')
return rlibc.dump(defname) #攻击世界 #For fmt, but the reliability is not high.
def fmt(offset,begin,end,size,written):
#fmt利用
payload = fmtstr_payload(offset,{begin: end},write_size = size,numbwritten=written)
return payload
'''
offset(int) - 您控制的第一个格式化程序的偏移量
字典(dict) - 被写入地址对应->写入的数据,可多个对应{addr: value, addr2: value2}
numbwritten(int) - printf函数已写入的字节数
write_size(str) - 必须是byte,short或int。告诉您是否要逐字节写入,短按short或int(hhn,hn或n)
'''

[刺客伍六七&黑客] 魔刀千刃evilblade的使用手册与开源的更多相关文章

  1. 2017-2018-1 我爱学Java 第六七周 作业

    团队六七周作业 完善版需求规格说明书 制定团队编码规范 数据库设计 后端架构设计 TODOList 参考资料 完善版需求规格说明书 <需求规格说明书>初稿不足之处: 1.开发工具写错 2. ...

  2. 201871010104-陈园园 《面向对象程序设计(java)》第六——七周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第六——七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daiz ...

  3. 201871010106-丁宣元 《面向对象程序设计(java)》第六—七周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第六—七周学习总结 正文开头 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu- ...

  4. 201871010128-杨丽霞《面向对象程序设计(java)》第六-七周学习总结

    201871010128-杨丽霞<面向对象程序设计(java)>第六-七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  5. 201871010132-张潇潇-《面向对象程序设计(java)》第六-七周学习总结

    201871010132-张潇潇-<面向对象程序设计(java)>第六-七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh ...

  6. Linux系统管理第五六七章 权限及归属管理 磁盘管理 文件系统与lvm

    第五六七章   alias 查看系统别名   67 chmod 设置文件或目录的权限 -R表示以递归的方式设置目录及目录下的所有子目录及文件的权限 u:属主 g:属组 o:其他人 a:所有人 +:添加 ...

  7. 201871010113-刘兴瑞《面向对象程序设计(java)》第六-七周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>htt ...

  8. [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条

    第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对 ...

  9. JAVA第六七八次大作业

         21201411-李英涵            前言:这几次的作业较为简单,主要思路就是利用正则表达式来过滤掉不需要的信息.  题量设置较为合理,比之前的多边形好做一些,应该是老师为了捞起来 ...

  10. Hacker(六)----黑客藏匿之地--系统进程

    windows系统中,进程是程序在系统中的依次执行活动.主要包括系统进程和程序进程两种. 凡是用于完成操作系统各种功能的各种进程都统称为系统进程: 而通过启动应用程序所产生的进程则统称为程序进程. 由 ...

随机推荐

  1. liunx上升级python2至python3

    一.背景介绍 虚拟机的liunx系统CentOS7自带了python2.7.5,为使用方便需要换成最新的版本3.10.4 二.安装方法 1.安装升级GCC yum install -y gcc* op ...

  2. java进阶(20)--final/fianlly/fianlize区别

    1.final关键字.表示最终的.不变的 final修饰的类无法继承 final修饰的方法无法覆盖 final修饰的变量不能重新赋值 举例: final double weight; 2.finall ...

  3. channel 是怎么走上死锁这条路的

    本篇文章接着 hello world 的并发实现一文介绍 Go 的 channel 类型,同时进一步介绍 channel 的几种死锁情况,这些都是代码中很容易遇到的,要重点摘出来讲,防止一不留神程序就 ...

  4. 结构体Struct、联合体Union与类Class

    结构体Struct.联合体Union与类Class 1. Struct/Class struct能包含成员函数吗? 能! struct能继承吗? 能!! struct能实现多态吗? 能!!! 1.1 ...

  5. [转帖]ssh_exporter

    https://github.com/treydock/ssh_exporter SSH exporter The SSH exporter attempts to make an SSH conne ...

  6. [转帖]SPEC CPU 2017 单线程整数性能测试与总结 (2022)

    https://zhuanlan.zhihu.com/p/574105237 x86处理器的整数性能在过去4年间取得了长足的进步 x86处理器移动端性能缩水非常严重 ARM公版的旗舰级处理器相比前代进 ...

  7. [转帖]技术分享 | 国产麒麟 arm 上编译安装 xtrabackup8

    原创 发布于 2022-07-19 13:29:29 3220 举报 作者:王向 爱可生 DBA 团队成员,负责公司 DMP 产品的运维和客户 MySQL 问题的处理.擅长数据库故障处理.对数据库技术 ...

  8. [转帖]【JVM】常用虚拟机参数及实例

    常用参数表 参数 描述 -XX:+PrintGC 启动java虚拟机后,只要遇到gc,就打印日志 -XX:+PrintGCDetails gc发生时,打印更详细的日志 -XX:+PrintHeapAt ...

  9. [转帖]Linux内核网络中的软中断ksoftirqd

    https://zhuanlan.zhihu.com/p/361976930 1. 前言 之前分享过Linux内核网络数据包的接收过程,当执行到网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了, ...

  10. Mysql Server System Variables [官网资料]

    5.1.7 Server System Variables The MySQL server maintains many system variables that configure its op ...