@TOC

Listing

打开是sse指令集

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
BITS 64
global check
section .text
check:
mov rbp, rsp
sub rsp, 0x100
VMOVDQA ymm0, [rdi]
and rsp, 0xffffffffffffff00
mov rax, 0xfeca50051345b0b0
push rax
push rax
push rax
push rax
VMOVDQA ymm1, [rsp]
VPXOR ymm2, ymm1, ymm0
mov rax, 0x0100030205040706
push rax
mov rax, 0x09080b0a0c0d0f0e
push rax
mov rax, 0x1110131215141716
push rax
mov rax, 0x19181b1a1c1d1f1e
push rax
VMOVDQA ymm3, [rsp]
VPSHUFB ymm4, ymm2, ymm3
mov rax, 0xd1d3762335619aab
push rax
mov rax, 0xd5d52327356583f8
push rax
mov rax, 0xc9d36127336c85b9
push rax
mov rax,0xd5d622713161cbf8
push rax
VMOVDQA ymm0, [rsp]
VPCMPEQQ ymm1, ymm4, ymm0
VMOVDQA [rsp], ymm1
pop rax
cmp rax, 0xffffffffffffffff
jnz fail
pop rax
cmp rax, 0xffffffffffffffff
jnz fail
pop rax
cmp rax, 0xffffffffffffffff
jnz fail
pop rax
cmp rax, 0xffffffffffffffff
jnz fail
mov rax, 1
jmp fin
fail:
xor rax, rax
fin:
mov rsp, rbp
ret



通过学习 大概了解了代码的思路
先把rdi与rax异或,然后用VPSHUFB调整代码顺序,最后一个比较跳转到fin
主要是VPSHUFB这条指令的学习 通过百度了解到
在这里插入图片描述
在这里插入图片描述

这两幅图可以让我们清楚的学会这条指令 ,然后就可以在纸上画出正确的值(一共就四条,不写脚本了)
拿到四个正确的值后 一个异或即可拿到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
e=0xfeca50051345b0b0

a=0x9aab35617623d1d3
b=0x83f865352327d5d5
c=0x85b9336c6127c9d3
d=0xcbf861312271d5d6

a=a^e
b=b^e
c=c^e
d=d^e
print(hex(a)[2:]+hex(b)[2:]+hex(c)[2:]+hex(d)[2:])
print(hex(a)[2:],hex(b)[2:],hex(c)[2:],hex(d)[2:])

Kernel Reverse

这道题当时没有做出来,因为对内核了解不是很多,再加上几乎没有做过内核题就放弃了
后来看了别人的写的wp后发现也不是特别难 hhh!
在这里插入图片描述
我们发现ioctl文件在/dev下
看一下别人写的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/wait.h>

int main()
{
int fd = open("/dev/ioctl", O_RDWR);
if (fd < 0)
{
printf("open file error!!\n");
exit(-1);
}
char flag[128];
unsigned int val1 = 0x13373389;
gettimeofday((struct timeval *)flag, NULL);
*(unsigned int *)flag = *(unsigned int *)flag ^ val1;
ioctl(fd, 0x5702, flag);
printf("%s\n", flag);
}

上传文件到当前目录下 运行即可拿到flag
在这里插入图片描述