0x01ichunqiu逆向刷题

ichunqiu逆向刷题

1、小菜一碟:re100

下载后,不知道是什么文件,用Notepad先看下

image-20201009173852508

发现关键字符:AndroidManifest.xml

改后缀名为apk,在模拟器中运行看看

image-20201009174041684

猜测是输入flag后会有成功的弹窗之类的

放到Androidkiller里看看

image-20201009173927463

反编译成功,查看一些关键性字符,找到”success”

查看java源码,分析

image-20201009174441430

查看encode加密代码,是md5

所以将字符串”NzU2ZDJmYzg0ZDA3YTM1NmM4ZjY4ZjcxZmU3NmUxODk=”先base64解码,然后Md5解密,然后翻转一下,即可获得flag:jlflag{admin123}

image-20201009174409777

2、Classical CrackMe

是一个exe文件,提示是注册码就是flag,打开运行

image-20201009174631889

猜测会出现”注册成功”的弹窗

放入IDA中,寻找关键字,分析

image-20201009174832915

即可找到对应的字符串,这个编码方式,用base64解码,即可得到flag

image-20201009174917940

3、FindKey-.pyc

下载文件,不知道是什么文件,用notepad打开看,能看到有关键字,但是感觉也没有明显特征能说明是什么文件,开始各种猜测

image-20201110112824228

image-20201110112848494

猜了一会儿,后缀名改成.py后能运行了,但是无法直接分析这个.py文件,猜测是加密了

将后缀改成.pyc,使用easy python decompiler反编译,成功,得到一个findkey.pyc_dis文件

打开后可以看到正常的Python代码,Pwda,lookup和pwdb是三个数组,分析

image-20201009175704669

编写一个脚本,思路:

一开始是想随机生成一个长度为17的字符串,然后把这个字符串用判定条件进行判定

但是后来觉得这样跑起来比较复杂费时并且存在一些问题

转换思路:将常用的字符列成数组,根据判定条件跑出每一个字符,最后组成字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
flag = ''
chars = ['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g',
'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q',
'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y',
'y', 'Z', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', '(', ')', '{', '}']
for i in range(0, 17):
for t in range(0, 68):
m = chars[t]
if ord(m) + pwda[i] & 255 == lookup[i + pwdb[i]]:
flag += m

flag = flag[::-1]
print(flag)

成功跑出flag:PCTF{PyC_Cr4ck3r}

image-20201009180535166

4、crackme-Python编写异或

下载文件,运行,发现有特殊字符”flag”

放到IDA里查看

发现能反编译的代码很少,怀疑加壳

查壳,加了ns的壳,搜索一下是北斗的壳,用脱壳机脱了即可

image-20201010140519865

重新放到IDA中

image-20201010140526805

image-20201010140559743

看到重点代码,编写脚本即可跑出flag

image-20201010140639734

image-20201010140648427

编写脚本过程中的问题:

一开始是想使用上次一样的方法,遍历flag字符然后按照原代码进行异或操作,但是由于对异或运算不了解和Python编写不熟,一直跑不出

此题注意:

异或运算:a^b^a=b,a^b=b^a,a^a=0,a^0=a

Python编写异或,ord(),chr(),十六进制的数组方式

可以直接用两个数组异或得到flag

1
2
3
4
5
6
7
8
9
byte_402130 = 'this_is_not_flag'
dword_402150 = [0x12, 0x4, 0x8, 0x14, 0x24, 0x5C, 0x4A, 0x3D, 0x56, 0x0A, 0x10, 0x67,
0x0, 0x41, 0x0, 0x1, 0x46, 0x5A, 0x44, 0x42, 0x6E, 0x0C, 0x44, 0x72, 0x0C, 0x0D, 0x40, 0x3E, 0x4B, 0x5F, 0x2, 0x1,
0x4C, 0x5E, 0x5B, 0x17, 0x6E, 0x0C, 0x16, 0x68, 0x5B, 0x12]
flag = ''
for i in range(0, 42):
flag += chr(ord(byte_402130[i % 16]) ^ dword_402150[i])

print(flag)

跑出得到flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}

5、CrackMe01-postmessagew

查壳,无壳

放到IDA里查看,未搜到关键字,运行,发现有输入框,查看关键函数(如getwindowtext等

image-20201012171116868

image-20201012171141100

查找主要代码sub_402650(调用了sub_418B95

image-20201012171248771

发现postmessagew函数,在这里可以查看各种函数的定义:https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-postmessagew

image-20201012171342573

postmessagew有四个参数,动态跑一下看看四个参数分别代表什么

动态跑程序时,在getwindowtextw处下断点,然后F8单步运行,跳到Postmessagew时将鼠标放到对应参数上即可看到

lParam:输入字符的个数

image-20201012171443991

wParam:输入的字符

image-20201012171449452

查看句柄hWnd:

image-20201012172152822

除了sub_402650调用以外,还有一个sub_402990函数

跟进去看看

image-20201012172232914

查看调用的函数sub_4027F0

image-20201012172309659

image-20201012172405031

查看chText数组

image-20201012172330350

注意:是两个字节一起

编写脚本:

final = 0x4B6
chText = [0x4F0, 0x4DA, 0x4D7, 0x4D1, 0x48C, 0x4FF, 0x4F5, 0x4FE, 0x4E3, 0x4F8, 0x4E7, 0x4FF, 0x4E3, 0x4E9,
0x4F0, 0x4F3, 0x425, 0x480, 0x484, 0x4F2, 0x4F4, 0x4F3]
for i in range(0, 22):
v6 = chr(chText[i] ^ final)
print(v6, end=’’)

image-20201110114140386

得到flag:ICHUNQIU_FE362DBE

参考:https://blog.csdn.net/wangtiankuo/article/details/81201853

https://www.cnblogs.com/wanghj-dz/p/3973543.html

https://www.cnblogs.com/qq78292959/archive/2012/07/20/2600865.html

6、Smali-smali2java

下载了一个smali文件,根据搜索,可以将Smali文件转成Java,利用软件smali2java转为java文件

image-20201012173233305

可以看到是一个base64+AES的解密过程

p1是加密的内容,p2是AES密钥

参考:https://www.cnblogs.com/caizhaokai/p/10944667.html

一开始直接解p1的base64,没解出来,然后p1p2都放到AES解密,也没解出来

就想要直接运行java程序跑的,发现有很多包的问题

然后解了一下p2的base64,出了明文

然后放到AES里解密

成功解出flag:PCTF{Sm4liRiver}

image-20201012164303217

7、小菜两碟-PE文件头修复

一个无法正常打开的文件,用editor看一下,查找到关键字

image-20201013162905495

尝试多种猜测后,应该是个exe,但是无法正常打开,怀疑PE头损坏

参考:https://www.cnblogs.com/2f28/p/9824366.html

https://bbs.pediy.com/thread-248817.htm

并打开一个正常的exe文件进行对比

发现两处错误,50450000是PE文件头,3C处是PE文件头地址(E9)

image-20201013163053400

修改为如下情况:

image-20201013163105139

修改之后可以正常放入IDA中分析了,无壳

根据关键字,找到主函数代码,反编译一下,分析

image-20201013163410920

image-20201013163418420

image-20201013163442850

可以看到flag是由前三个数字加上’abc’组成的,即v20,21,22

编写脚本跑出前三个数字:

1
2
3
4
5
6
for v20 in range(0, 100):
for v21 in range(0, 100):
v22 = (v21 ^ v20) + 4
if(v22 * v21 * v20 // 11 == 106):
if((v22 + v21 + v20) % 100 == 34):
print(v20, v21, v22)

image-20201013133507441

然后一个个尝试即可

image-20201013163550796