LCTF2018 WriteUp

Web

bestphp's revenge

T4lk 1s ch34p,sh0w m3 the sh31l

解题思路

初步分析:

进⼊http://212.64.7.171/LCTF.php

代码神似hitcon2017的Baby^H-master-php,区别点如下:

a.去年的有Admin类考了随机数,⽽本题没有,于是难度没那么⾼。

b.去年的upload没有过滤。

c.本题多了check()和move(),解题的关键点所在。

d.move()可以进⾏复制,源地址被过滤太多,⽽⽬的地址存在⽬录穿越漏洞,但很可惜 前⾯被拼接了字符串,以⾄于不能使⽤phar://

e.check()也是过滤很多,⽽且使⽤了getmagezie()函数,其实⽆所谓什么函数,能使⽤ phar协议来进⾏反序列化即可。

题⽬提示:The only way you can get the flag is to use grep to check all the folders in the /

突破⼝:

check()函数过滤没其他的严格

这⾥⾯是使⽤了^字符,⽽本题其他函数的正则匹配皆没有这个,于是这可能是个突破 ⼝。 可使⽤compress.zlib://phar://代替phar://从⽽绕过过滤。 ⽽phar的反序列化最多是包含⽂件,于是可以本身写⻢,然后包含本身。

访问下⽹址,获取session值,解码后得到其哈希值

本机php7编写脚本如下

运⾏后得到avatar.gif,上传到⾃⼰的云主机上

上传

命令执行

Misc

签到题

洛必达?不不不

LCTF

你会玩osu!么?

LCTF

PWN

easyheap

off by one:

libc2.27->tcache 只能malloc(0xF8) 可以先填满对应的tcache bin获得unsorted bin

审错了他的read过程,看成了

以为会连续⽣成两个"\x00",没法bypass,(fd和bk只有末位是"\x00"),卡了好久。晚上回来重新看发现看错了orz

剩下就是利⽤off by one覆盖prev in use,使两个堆块发⽣合并,然后便可以有两个索引指向同⼀个chunk。

⽽后进⾏tcache的double free,使chunk分配到malloc hook,写⼊one_gadget,再malloc⼀次 即可getshell

RE

去签到吧朋友

在init中有对401E79的SMC和基于进程名检查的反调试;401D90函数也是对401E79的 SMC。 输⼊⻓度限制为36字节。 将输⼊分别以两种⽅式遍历(不管什么⽅式,与解题关系不⼤,⼤概与树有关);将两种遍历 结果分别进⾏加密或类似操作、结果与常量⽐较并校验部分输⼊遍历前后的序号。两种遍历的 结果可以通过加密算法和最终的校验数据得出,再加上序号的校验,分别得出原始输⼊前或后 部分,合在⼀起就能得到正确的原始输⼊。

对第⼀种遍历结果加密的加密算法是des,密钥为fa1conn,加密后结果⼜进⾏了算术运算。 可解⽅程得出加密串的前36字节,加上明⽂校验的后4字节,得到完整加密串的hex值: 77afddee5cabcba362635c5d93180bfbc9174647b91d768eb6e3f5c7ac643479088e45f 9733cf57c

z3解⽅程的代码如下:

DES解密后得到:LC-+)=1234@AFETRS 根据序号校验,前18字节输⼊在遍历后的序号为: 0,1,14,12,17,18,19,27,28,2,15,20,31,29,30,16,13,5 即得到前18字节输⼊:LCTF

flag为:LCTF

easy_vm

常规VM题,handler如下:

VM上下⽂使⽤的数据结构如下:

对应的三段vm解析后为:

反解如下:

想起「 Lunatic Game

这是⽤了 Glasgow Haskell Compiler么。。。业务逻辑全在sub_402427中。游戏的初始化, 胜负判断,⼤概看下,胜利就输出flag,且游戏过程对最后flag输出没有影响,直接动态,游 戏初始化后,跳到4023C8运⾏,直接输出flag。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181119G10PNM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券