首页 > 其他分享 >[刺客伍六七&黑客] 魔刀千刃evilblade的使用手册与开源

[刺客伍六七&黑客] 魔刀千刃evilblade的使用手册与开源

时间:2023-08-15 23:12:41浏览次数:81  
标签:return 千刃 args libc evilblade 使用手册 print defname lambda

0x00 前言

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

—–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)
'''

标签:return,千刃,args,libc,evilblade,使用手册,print,defname,lambda
From: https://www.cnblogs.com/9man/p/17632690.html

相关文章

  • [刺客伍六七&黑客] 魔刀千刃诞生与维护记录
    魔刀千刃的特写诞生之日:2023.7.29上传至pip源之日:2023.8.15此后会在此记录如何自己写一个自己的python库以及魔刀千刃的维护过程。魔刀千刃(evilblade)**只攻不防,天下无双**实战(和堆攻击帖子重合了,没关系)0x0bhitcontraining_heapcreator这是buu的pwn第二页最后一题......
  • CE使用手册-练习3
    我们进行第三关的练习练习要求步骤3:未知的初始值(密码=419482)OK,看来你已经理解了如何利用"精确数值"扫描查找数值了,让我们进行下一步。首先说明下重点.因为你要进行的是"新的扫描",所以你必须首先点击"新的扫描"才能开始一个"新的扫描".(你一定认为这很简单,但是有很多......
  • CE使用手册-练习2
    我们进入第二个练习练习要求步骤2:精确值扫描(密码=090453)现在你已经用CheatEngine中打开了教程,为我们下一步的练习做好了准备。你可以在本窗口的左下方看到显示的"健康:XXX",在你每次点击"打我"按钮时,它的值便会减少。要进入下一关,你必须找到这个数值并把它改成1000。......
  • 牧云·云原生安全平台使用手册:镜像/容器/Web资产清点
    牧云·云原生安全平台 是长亭牧云团队以开源社区为生态载体技术积累为驱动所打造的云原生安全平台。本文将介绍如何使用牧云·云原生安全平台进行镜像/容器/Web资产清点。首先,在我们进行下面 镜像/容器/Web资产清点前,我们需要先安装探针进行资产的采集工作。探针的安装包括本地......
  • 魔刀千刃(轮廓)
    #include<iostream>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intmain(){boolc=true;c=mc.ConnectMinecraft("zk","badaa4c2a1b546f1868517667456b050");if(!c){cout<<"连接失败"<<endl;return0......
  • git使用手册
    基本操作初始化gitinit 查询当前分支状态gitstatus 查看当前分支名称gitbranch 切换分支gitcheckoutxxx#要切换的分支名称 拉取最新当前分支gitpull 创建本地分支并切换到此分支gitcheckout-bdeveloporigin/develop#本地源/云分支......
  • Readme使用手册
    title:Readme工具使用手册categories:-手册目录ReadMe用法npx用法Windows系统使用ReadMereadme是一个自动生成readme的工具开源项目地址:https://github.com/kefranabg/readme-md-generator开源项目作者:FranckAbgrall用法npx用法Makesureyouhavenpxi......
  • GitLib详细使用手册(windows系统)
    Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。对gitlab的常见的使用有建立仓库、提交代码、更新代码、回滚代码、显示/修改日志、拉取分支、解决冲突、设置比较工具等一、安装git下载官网地址: https://git-scm.com/downloads根据操......
  • 奇安信使用手册
    0.0登录账号为学号初始密码为123@Qweasd首次进入会自动更改密码1.0主界面2.0添加课程自主学习目光锁定左侧导航栏点击自主学习首次进入是没有任何课程(我是因为自己添加一次课程才有课)目光锁定右上角添加每个课右上角都有的标志,点击即可加入课程选择课程后,点击左......
  • xlwings 使用手册
    前言本人目前也在学习中,仍有不足或考虑不全面的地方.如若发现文档内容存在错误请联系我更改.谢谢!pip国内源清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/阿里云:http://mirrors.aliyun.com/pypi/simple/中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/华......