@TOC
寒假打卡地

Easy Crack

在这里插入图片描述
在这里插入图片描述拼接flag得
Ea5yR3versing

Easy Unpack

od单步调试 可以找到oep

Easy Keygen

异或

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int data[100]={0x5B,0x13,0x49,0x77,0x13,0x5E,0x7D,0x13};
int key[10]={0x10,0x20,0x30};
int main(){
for(int i=0;i<8;i++){
data[i]^=key[i%3];
printf("%c",data[i]);
}


return 0;
}

在这里插入图片描述

Easy ELF

简单异或
0x78^0x34
0x31
0x7C^0x32
0xDD^0x88
0x58

CSHOP

c#程序
在这里插入图片描述有乱码先去混淆
在这里插入图片描述修改按钮大小

在这里插入图片描述
在这里插入图片描述

HateIntel

4轮大循环,每次做特定操作,每位直接没有联系,可以爆破
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

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
#include<stdio.h>
#include<stdlib.h>
int a[100]={ 0x44, 0xF6, 0xF5, 0x57, 0xF5, 0xC6, 0x96, 0xB6, 0x56, 0xF5,
0x14, 0x25, 0xD4, 0xF5, 0x96, 0xE6, 0x37, 0x47, 0x27, 0x57,
0x36, 0x47, 0x96, 0x03, 0xE6, 0xF3, 0xA3, 0x92};//28
int flag[100];
int main(){
int q;

for(int i=0;i<28;i++){
for(int j=33;j<127;j++){
q=j;
for(int p=0;p<4;p++){
q*=2;
if((q&0x100) !=0){
q=q|1;
}
q=q%256;
}
//printf("%x ",q);
if(q==a[i]){
printf("%c",j);
break;
}
}
}
return 0;
}

replace

根据名称和ida提示的消息可以看出是通过输入修改了自身的代码
动调到报错的部分
eax=0x6016 05CB+flag
可以发现在这里程序会把eax为地址的部分nop掉
在这里插入图片描述在这里插入图片描述
继续跟踪到后面,发现只需要把jmp指令nop掉即可
在这里插入图片描述所以应该满足 flag+0x6016 05CB=0x401071
计算机算一下 flag=0xa02a0aa6=2687109798

muisc player

vb程序,可以静态分析,这里因为他说了超过一分钟就能看见flag,所以我这里用od动调
先播放一遍,看见一分钟弹窗了
那就基本操作,弹窗后暂停,查看堆栈,找到对应的对话框函数,在上面找见了判断函数,修改为jmp即可。
在这里插入图片描述

弹出第二个对话框
在这里插入图片描述
如法炮制,没有找到第二个对话框,就把时间暂停在59秒,下断点,单步执行,找到函数
在这里插入图片描述把上面的跳转函数修改为jmp
在这里插入图片描述

position

长度为4位,关键加密如下,可以z3求解
在这里插入图片描述
有多解,所以限制要全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from z3 import *
a=[BitVec(('x%d'%i),8) for i in range(4)]
s = Solver()
s.add(((a[0]&1)+5+(((a[1]>>2) & 1 )+1))==ord('7')-0x30)
s.add(((((a[0]>>3) & 1)+5)+(((a[1]>>3)&1)+1))==ord('6')-0x30)
s.add((((a[0]>>1) & 1)+5+(((a[1]>>4) & 1 )+1))==ord('8')-0x30)
s.add((((a[0]>>2) & 1)+5+(((a[1]) & 1 )+1))==ord('7')-0x30)
s.add((((a[0]>>4) & 1)+5+(((a[1]>>1) & 1 )+1))==ord('6')-0x30)
s.add((((a[2]) & 1)+5+(((a[3]>>2) & 1 )+1))==ord('7')-0x30)
s.add((((a[2]>>3) & 1)+5+(((a[3]>>3) & 1 )+1))==ord('7')-0x30)
s.add((((a[2]>>1) & 1)+5+(((a[3]>>4) & 1 )+1))==ord('7')-0x30)
s.add((((a[2]>>2) & 1)+5+(((a[3]) & 1 )+1))==ord('7')-0x30)
s.add((((a[2]>>4) & 1)+5+(((a[3]>>1) & 1 )+1))==ord('6')-0x30)
s.add(a[3] == ord('p'))
for i in range(0,4):
s.add(a[i] > 97)
s.add(a[i] < 127)

if(s.check()==sat):
result=s.model()
str=[chr(result[a[i]].as_long().real) for i in range(4)]
print("".join(str))

imageprc

画图题,搜索wrong定位到关键部分
在这里插入图片描述
把资源文件提取出来,与我门画的相比,要求大于90000个一样
在网上学习到用工具提取出数据,再用脚本还原图片

1
2
3
4
5
6
7
8
9
10
11
from PIL import Image

width = 200
height = 150

image_file = open('C:\\Users\\86178\\Desktop\\dump', 'rb')
data = image_file.read()
image = Image.frombuffer('RGB', (width, height), data, 'raw', 'RGB')
image = image.transpose(Image.FLIP_TOP_BOTTOM)
image.show()
image_file.close()

得到got

position

file本来是个exe,被加密了
打开run,发现有混淆 patch一下可以反编译
异或key,然后取反
在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
int a[100]={0xDE,0xC0,0x1B,0x8C,0x8C,0x93,0x9E,0x86,0x98,0x97,0x9A,0x8C,0x73,0x6C,0x9A,0x8B};
int b[100]={0x4D,0x5A,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00};
int main(){

for(int i=0;i<16;i++){
b[i]=~b[i];
b[i]=b[i]^a[i];
printf("%c",b[i]);
}



//letsplaychess



return 0;
}

求出key后解密文件,运行file.exe拿到flag

FPS

打枪游戏
搜索game clear定位到对话框的位置
在这里插入图片描述
找到加密部分,后面的数组静态不好分析,下断点后,打怪可以断下来,发现是cl是eax的4倍
在这里插入图片描述
写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
int a[100]={ 67, 107, 102, 107, 98, 117, 108, 105, 76, 69,
92, 69, 95, 90, 70, 28, 7, 37, 37, 41,
112, 23, 52, 57, 1, 22, 73, 76, 32, 21,
11, 15, 247, 235, 250, 232, 176, 253, 235, 188,
244, 204, 218, 159, 245, 240, 232, 206, 240, 169, };
int main(){
for(int i=0;i<50;i++){
a[i]^=(i*4);
printf("%c",a[i]);
}








return 0;
}

multiplicative

反编译jar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class JavaCrackMe {
public static final synchronized /* bridge */ strictfp /* synthetic */ void main(String ... stringArray) {
try {
System.out.println("Reversing.Kr CrackMe!!");
System.out.println("-----------------------------");
System.out.println("The idea came out of the warsaw's crackme");
System.out.println("-----------------------------\n");
long l = Long.decode(stringArray[0]);
if ((l *= 26729L) == -1536092243306511225L) {
System.out.println("Correct!");
} else {
System.out.println("Wrong");
}
}
catch (Exception exception) {
System.out.println("Please enter a 64bit signed int");
}
}
}

计算(l *= 26729L) == -1536092243306511225L即可