稍微学学逆向
FindKey
拿到文件顺手就往ida里拖,结果说是bin文件,所以还是乖乖将他拖到了kali里,file查看文件属性,是个pyc?(仿佛想到了某入群题)
将pyc还原成py文件
发现一个简单的加密过程(不过还是有点没太明白那个 +- & 的执行顺序)
直接上wp
1 | import sys |
- 对od产生了深深的抗拒!! 除了打开会报毒,用起来整个电脑都卡炸了!! 差点gg
stheasy
没什么套路。。简单的加密就完事了,不过知道了ida可以使用shift+e 批量提取数据。。不用苦逼的一个个写了。
脚本:
1 | a = [0x48,0x5d,0x8d,0x24,0x84,0x27,0x99,0x9f,0x54,0x18,0x1e,0x69,0x73,0x33,0x15,0x72,0x8d,0x33,0x24,0x63,0x21,0x54,0x0c,0x78,0x78,0x78,0x78,0x78,0x1b] |
hello
还是简单的加密,mach-o 文件,ida分析一下, 还是简单的处理,直接上脚本
1 | v2 = (0x20 >> 2 )^ 0x41 |
软件密码破解-1
如果可以定位到关键函数的话其实还是挺简单的,ida全是函数无从下手,od 将程序跑起来,中文字符串搜索中能看到有个你赢了
到了地址之后,稍微往上翻便可以确定到关键判断的地方
1 | 01191C51 |. /7E 16 jle short CTF_100_.01191C69 |
很明显就是xor之后比较一下就行了,直接上脚本
1 | a = [0x28,0x57,0x64 ,0x6B ,0x93,0x8F ,0x65 ,0x51 ,0xE3 ,0x53 ,0xE4 ,0x4E ,0x1A ,0xFF] |
软件密码破解-2
一道比较有趣的逆向。
思路
开始看是先接收输入然后进入一个函数一通操作之后检查返回值是否为-1。进入该函数后可以看到把输入作为参数又起了一个子进程等待返回,然后往子进程的内存里面写了一些数据,然后又读了一些数据,之后对这些数据进行判断。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18*(_DWORD *)v22 = 0x148A4690;
*(_DWORD *)&v22[4] = 0xF14300E;
*(_DWORD *)&v22[8] = 0x75C83B41;
v22[12] = 0xF5u;
WriteProcessMemory(ProcessInformation.hProcess, (LPVOID)(Context.Eip - 1), v22, 0xDu, &NumberOfBytesWritten);
...
...
ReadProcessMemory(
ProcessInformation.hProcess,
DebugEvent.u.CreateThread.hThread,
Buffer,
DebugEvent.u.DebugString.nDebugStringLength,
&NumberOfBytesRead);
if ( Buffer[0] != 0x2B5C5C25 || Buffer[1] != 0x36195D2F || Buffer[2] != 0x7672642C )
result = -1;
else
result = -(Buffer[3] != 0x524E6680);
这样调试就有点无从下手了,直接重启一个程序加入参数,发现程序进入了另一个分支,然后调试单步继续走会碰到int 3使得中断等待父进程,所以父进程的WriteProcess应该就是写入这里。
手动把写入进去之后,发现是将输入的参数与’elcome to CFF test!’进行异或操作,在之后对每个字节的值加一后就返回了。
所以直接写下脚本就行1
2
3
4
5
6
7s = [0x25,0x5c,0x5c,0x2b,0x2F,0x5d,0x19,0x36,0x2c,0x64,0x72,0x76,0x80,0x66,0x4e,0x52]
ss = b'elcome to CFF test!'
flag = ''
for i in range(16):
flag += chr((ss[i])^(s[i]-1))
print(flag)
Classic Crackme 2
.net 逆向。
思路
需要用dnspy逆向,刚开始看挺吓人。直接开始调试,在入口处断点,发现run了个函数。1
2
3Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Wm@@9OrPgw\u0020d/p?i,N>l*h@Y!());
直接进入该函数,看到有加密环节,下个断点跟一下,发现就是使用AES对输入进行加密之后base64与一个字符串比较,写脚本即可1
2
3
4
5
6
7
8
9import base64
from Crypto.Cipher import AES
enc = "x/nzolo0TTIyrEISd4AP1spCzlhSWJXeNbY81SjPgmk="
key = "pctf2016"*4
aes = AES.new(key,AES.MODE_ECB)
flag = aes.decrypt(base64.b64decode(enc))
print flag
FindPass
apk调试
思路
正常的apk逆向发现一堆流程之后最后直接进行比较,发现与一串字符串相同即为flag,便尝试看能不能直接调试。
前面尝试了好久的android stdio与模拟器连接调试一直有各种各样的问题,(辣鸡as hhh
最后发现jeb也可以直接调试!!
之前尝试的时候对apk进行了可选调试的处理,不太清楚这里是否是必须的
1 | 针对release版本apk的处理: |
模拟器上安装该apk,连接后开启等待调试的包名
1 | adb.exe connect 127.0.0.1:62001 |
jeb打开apk,ctrl+B下好断点,开启调试,可以直接搜索到模拟器上等待调试的应用,调试即可。
Fibonacci
2020.9.21 好久没做过题了,试图回归学习正轨~
知识点:java转exe程序逆向
运行提示我 Java Runtime Environment not valid,查了下发现是jre有问题,装了个新的就可以运行了。也可以知道这是java转的exe。
ida打开发现找不到关键函数也没有相关字符串,想来java转的exe应该不是对源函数进行转义的。相关java打包成exe主要操作为将jvm一起打包进去,最后运行时仍然相当于在jvm的基础上运行java程序。
找个exe2jar的程序,按方法在文件夹先运行设置环境变量,再运行源程序,会生成dump.jar文件,使用jd-gui查看该文件,得到一个Fibonacci类。
1 | package top.phrack.ctf.Fibonacci; |
发现主函数根本没有校验函数,hello函数应该是RC4加密,heheda函数是调用了类b里面的两个变量进行了RC4,但是没dump出类b,因为类b中没用方法,e2j中使用的Java Agent监控法无法监控到。
关于对jar2exe程序的解包教程相关文件 下载