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
|
#include<stdio.h>
#include<sys/mman.h>
__attribute__((naked,noinline)) void* f(void* dst, void* p) {
__asm__(
"\n pushq %rbp"
"\n movq %rsp, %rbp"
"\n movq %rdi, %rax"
"\n movq $0x0, (%rdi)"
"\n movl $0x140a, (%rdi) # imm = 0x140A"
"\n movb $0x4, 0x5(%rdi)"
"\n cvtps2pd (%rsi), %xmm0"
"\n movups %xmm0, 0x8(%rdi)"
"\n cvtps2pd 0x8(%rsi), %xmm0"
"\n movups %xmm0, 0x18(%rdi)"
"\n popq %rbp"
"\n retq"
);
}
int main() {
char dst[1000];
int page = 4096;
char* buf = mmap(NULL, page*2, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
// mprotect(buf+page, page, 0);
float* src = (float*)(buf+0x40);
printf("src: %p\n", src);
void* r = f(dst, src);
printf("res: %p\n", r);
}
|