陇原战'疫'

⏳:2021-11-7

power

题目说是arm汇编

用 Resource Hacker 打开

发现S盒

 

然后搜索找到main函数

 

发现第1253行

.size ZN3aes14encryption_cbcEPcS0, .-ZN3aes14encryption_cbcEPcS0

aes 和 cbc

所以可以肯定是aes加密 是不是cbc模式难说

找到16位密钥

this_is_a_key!!!

接着找到密文

1030a9254d44937bed312da03d2db9adbec5762c2eca7b5853e489d2a140427b

之后可以用在线网站aes解码

使用cbc模式解码失败 换成ecb模式成功

放上个脚本:

1
2
3
4
5
6
7
8
from Crypto.Cipher import AES
from Crypto.Util.number import long_to_bytes

key = b'this_is_a_key!!!'
enc = long_to_bytes(0x1030a9254d44937bed312da03d2db9adbec5762c2eca7b5853e489d2a140427b)
ae = AES.new(key, AES.MODE_ECB)

print(ae.decrypt(enc))

flag{y0u_found_the_aes_12113112}


findme

32位 无壳 ida32打开

找到main函数 发现字符串长度为26

 

 

之后根据主函数中的 off_403844 找到 sub_401866 函数 并进入

 

发现函数是RC4加密

关键点在于第39行的函数 sub_401767 和第42行的 dword_403040 值

先取出dword的值

0xB7, 0xFF, 0xFF, 0xFF, 0x52, 0x00, 0x00, 0x00, 0x85, 0xFF,

0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0x90, 0xFF, 0xFF, 0xFF,

0xE9, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xB8, 0xFF,

0xFF, 0xFF, 0xE4, 0xFF, 0xFF, 0xFF, 0x1A, 0x00, 0x00, 0x00,

0xC3, 0xFF, 0xFF, 0xFF, 0xBD, 0xFF, 0xFF, 0xFF, 0x1D, 0x00,

0x00, 0x00, 0x8E, 0xFF, 0xFF, 0xFF, 0x85, 0xFF, 0xFF, 0xFF,

0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,

0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xFF, 0xFF,

0xEF, 0xFF, 0xFF, 0xFF, 0x70, 0x00, 0x00, 0x00, 0x32, 0x00,

0x00, 0x00, 0xB5, 0xFF, 0xFF, 0xFF, 0x11, 0x00, 0x00, 0x00,

0xC6, 0xFF, 0xFF, 0xFF

进行整理:

0xB7,0x52,0x85,0xC1,0x90,0xE9,0x07,0xB8,0xE4,0x1A,

0xC3,0xBD,0x1D,0x8E,0x85,0x46,0x00,0x21,0x44,0xAF,

0xEF,0x70,0x32,0xB5,0x11,0xC6

之后我们需要动调来获得加密后的字符串的值

断点如下

main函数的

 

sub_401866 函数的

 

之后动调

输入值

12345678901234567890123456

F7 F9 进入函数 sub_401767

两个窗口对照查看

 

首先我们先运行到for循环的最后一行 也就是第21行

 

之后我们在 IDA View 中进行单步F8 运行到for循环第一轮结束时候 也就是

 

现在我们可以看到 [eax] 里存放的值 是我们输入的值

 

dl 的值 也就是 xor edx,ecx 中edx的值 是

 

所以我们输入的第一个值 0 经过函数 sub_401767 加密后 变成了 D5

之后我们可以 通过单步F8的值记录 EDX 的值

也可以在 sub_401866 函数的第40行继续下断点

F9执行出来之后F8运行到main函数断点下 回头找到 inputt 的值

0xD5, 0x25, 0xE2, 0xB6, 0xF1, 0x99, 0x4B, 0xD4, 0xB5, 0x1B,

0x81, 0xD0, 0x47, 0x8F, 0xEF, 0x35, 0x05, 0x46, 0x48, 0xEB,

0x8C, 0x21, 0x6C, 0xB8, 0x05, 0x8D

已知是RC4 加密

用假密文异或假明文得到密钥流,然后用密钥流对密文进行异或得到明文

可以写脚本求出flag

1
2
3
4
5
6
7
8
9
10
11
12
inputt = "12345678901234567890123456"

dwo = [0xD5,0x25,0xE2,0xB6,0xF1,0x99,0x4B,0xD4,0xB5,0x1B,
0x81,0xD0,0x47,0x8F,0xEF,0x35,0x05,0x46,0x48,0xEB,
0x8C,0x21,0x6C,0xB8,0x05,0x8D]

rc4 = [0xB7,0x52,0x85,0xC1,0x90,0xE9,0x07,0xB8,0xE4,0x1A,
0xC3,0xBD,0x1D,0x8E,0x85,0x46,0x00,0x21,0x44,0xAF,
0xEF,0x70,0x32,0xB5,0x11,0xC6]

for i in range(26):
print(chr(ord(inputt[i]) ^ unk[i] ^ rc4[i]), end='')

flag{Th1s_i5_E2_5tRcm9!}


EasyRE_Revenge

查壳 ida打开

找到main函数

简单分析一下

 

进入 sub_411F4 函数中 发现数据出错

 

找到出错位置 并向下查看 发现

很明显 要用idc代码除去花指令 (快捷键 shift+f2)

(也可以手动nop 这里是先手动nop 然后找出不需要nop的关键数据 再写脚本)

 

附上官方idc脚本(自己写不出来。。)

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
//IDC脚本
auto addr_start = 0x004117A0;//函数起始地址
auto addr_end = 0x00411E58;//函数结束地址
auto i=0,j=0;
for(i=addr_start;i<addr_end;i++){
if(Dword(i) == 0x1E8){
for(j=0 ; j<6; j++,i++ ){
PatchByte(i,0x90);//0x90是nop表示的字节
}
i=i+4;
for(j=0 ; j<3; j++,i++ ){
PatchByte(i,0x90);
}
i=i+10;
for(j=0 ; j<3; j++,i++ ){
PatchByte(i,0x90);
}
i=i+5;
for(j=0 ; j<1; j++,i++ ){
PatchByte(i,0x90);
}
i=i+3;
for(j=0 ; j<2; j++,i++ ){
PatchByte(i,0x90);
}
i--;
}
}

之后在有问题的起始地址 p 创建函数 之后查看

我的效果:

 

官方的效果:

 

不仅不好看而且还少了一位。。。

好像少了不止一位 一行也没有了

Exp:

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
from z3 import *

v5 = [0x271e150c,0x3b322920,0x5f564d44,0x736a6158,0x978e857c,0xaba29990,0xcfc6bdb4,0xe3dad1c8]

v6 = [0,0,0,0,0,0,0,0]

data = [0x0EEE8B042,0x57D0EE6C,0x0F3F54B32,0x0D3F0B7D6,0x0A61C389,0x38C7BA40,0x0C3D9E2C,0x0D64A9284]

x0=BitVec('x0',32)
x1=BitVec('x1',32)
x2=BitVec('x2',32)
x3=BitVec('x3',32)
x4=BitVec('x4',32)
x5=BitVec('x5',32)
x6=BitVec('x6',32)
x7=BitVec('x7',32)

s = z3.Solver()

v6[0]=x0^v5[2]
v6[1]=x1^v5[1]
v6[2]=x2^v5[0]
v6[3]=x3^v5[7]
v6[4]=x4^v5[6]
v6[5]=x5^v5[5]
v6[6]=x6^v5[4]
v6[7]=x7^v5[3]

for i in range(8):
v6[i] ^= (v6[i] << 7)
v6[i] ^= v5[(i*7+3)%8]
v6[i] ^= v6[(i*5+3)%8]
v6[i] ^= (v6[i]<<13)
v6[i] ^= v5[(i*7+5)%8]
v6[i] ^= (v6[i]<<17)

s.add(data[0]==v6[0],data[1]==v6[1],data[2]==v6[2],data[3]==v6[3],data[4]==v6[4],data[5]==v6[5],data[6]==v6[6],data[7]==v6[7],)

if s.check() == sat: #z3标配语句 若有结果则赋值给result
result = s.model()

#print(result)

#x0 = 1630954594,x1 = 828781622,x2 = 862085687,x3 = 909140836,x4 = 825516597,x5 = 1633759329,x6 = 879047012,x7 = 943285560

flag = [1630954594,828781622,862085687,909140836,825516597,1633759329,879047012,943285560]
#转成字符
def THEFLAG(t): #试了半天别的方法 感觉还是这个方法好一点
for i in range(4):
num = t % 0x100
print(chr(num), end='')
t = t // 0x100

for i in range(len(flag)):
THEFLAG(flag[i])

flag{bd6a64f17bb3dc065b41a0aad1e48e98}


O

参考:https://hackmd.io/@crazyman/SkyAgiK4F#Reverse

emo了