jarvisOJ - 逆向wp
2018-12-24 本文已影响0人
fantasy_learner
androidReverse
android killer 反编译后,用ak自带的查看源码,报错缺少对应的java代码文件。使用 dextojar 反编译处对应的Java代码即可查看。
关键处理(将输入的每个字符 异或 0x17)和 最后的对比结果 (byte[])
bytes = [113, 123, 118, 112, 108, 94, 99, 72, 38, 68, 72, 87, 89, 72, 36, 118, 100, 78, 72, 87, 121, 83, 101, 39, 62, 94, 62, 38, 107, 115, 106]
for byte in bytes:
print(chr(byte ^ 0x17) , end ="")
classical CrackME
- 1.exeinfope 的结果显示 CrackMe.exe 是一个.NET executable 程序 ,所以使用 ilspy 打开 , 在第一个类中看到关键逻辑
- 将 输入 base64 之后与固定字符串比较
- 解base64 得到 flag
classical CrackME2
考点 : 动态调试
__一开始思路错了,静态调试,认为是被混淆了,结果解混淆之后把aes算法分解开了,今天分析不下去,开始搜wp,知道考点是动态调试,工具dnspy __
用解混淆后的程序动态调试启动失败,用原程序启动,在button的点击事件处下断点,f8和f7混合使用,来了解控制流。
单步了解到 获取输入文本内容,检测是否为空,然后对文本内容进行加密
加密方式: aes加密,key = pctf2016 pctf2016 pctf2016 pctf2016
模式 ecb
填充: pkcs7padding
单步到输入结果和flag对比的时候,调试器截图中 a 为输入结果的密文,b为flag的密文,将b用上面的aes 解密获取到flag PCTF{Dot_Net_UnPack3r_yoo}
find_key
- uncompyle6 反编译 pyc 为 py文件 , 目前只测试过反编译 python2.7 文件
- 根据反编译的结果 (注释掉的部分 ) 进行逆向算法,得出flag
- 下方的注释部分为 反编译的原代码, 未注释的为逆向计算代码
import sys
lookup = [196,153, 149,206, 17,221, 10, 217, 167, 18, 36, 135, 103, 61, 111, 31, 92, 152, 21, 228, 105, 191, 173, 41, 2, 245, 23, 144, 1, 246, 89, 178, 182, 119, 38, 85, 48, 226, 165, 241, 166, 214, 71, 90, 151, 3, 109, 169, 150, 224, 69, 156, 158, 57, 181, 29, 200, 37, 51, 252, 227, 93, 65, 82, 66, 80, 170, 77, 49, 177, 81, 94, 202, 107, 25, 73, 148, 98, 129, 231, 212, 14, 84, 121, 174, 171, 64, 180, 233, 74, 140, 242, 75, 104, 253, 44, 39, 87, 86, 27, 68, 22, 55, 76, 35, 248, 96, 5, 56, 20, 161, 213, 238, 220, 72, 100, 247, 8, 63, 249, 145, 243, 155, 222, 122, 32, 43, 186, 0, 102, 216, 126, 15, 42, 115, 138, 240, 147, 229, 204, 117, 223, 141, 159, 131, 232, 124, 254, 60, 116, 46, 113, 79, 16, 128, 6, 251, 40, 205, 137, 199, 83, 54, 188, 19, 184, 201, 110, 255, 26, 91, 211, 132, 160, 168, 154, 185, 183, 244, 78, 33, 123, 28, 59, 12, 210, 218, 47, 163, 215, 209, 108, 235, 237, 118, 101, 24, 234, 106, 143, 88, 9, 136, 95, 30, 193, 176, 225, 198, 197, 194, 239, 134, 162, 192, 11, 70, 58, 187, 50, 67, 236, 230, 13, 99, 190, 208, 207, 7, 53, 219, 203, 62, 114, 127, 125, 164, 179, 175, 112, 172, 250, 133, 130, 52, 189, 97, 146, 34, 157, 120, 195, 45, 4, 142, 139]
pwda = [188, 155, 11, 58, 251, 208, 204, 202, 150, 120, 206, 237, 114, 92, 126, 6, 42]
pwdb = [53, 222, 230, 35, 67, 248, 226, 216, 17, 209, 32, 2, 181, 200, 171, 60, 108]
# flag = raw_input('Input your Key:').strip()
# if len(flag) != 17: #长度 17
# print 'Wrong Key!!'
# sys.exit(1)
# flag = flag[::-1] #逆序
# for i in range(0, len(flag)):
# if ord(flag[i]) + pwda[i] & 255 != lookup[i + pwdb[i]]:
# print 'Wrong Key!!'
# sys.exit(1)
flag = ""
for i in range(17):
flag += str(chr(lookup[i + pwdb[i]] - pwda[i] & 255))
print(flag[::-1])
# print 'Congratulations!!'
# okay decompiling findkey.pyc
smail
- info :本题 主要是熟悉下smail ,smail 理解后 是一个 base64 的 aes 加密 ecb 模式
自己简单翻译的 smailToJava
int constructor(){
this.str2 = "cGhyYWNrICBjdGYgMjAxNg==";
this.getflag("sSNnx1UKbYrA1+MOrdtDTA==");
}
string getflag(string str){
string v3 = null;
byte[] v2 = str.getBytes();
byte[] v0 = Base64.decode(v2 , v3);//v0 : content byte[]
String v1;
v2 = this.str2.getBytes();
v2 = Base64.decode(v2 , v3);
v1 = new string(v2); //v1 : kk String
v3 = this.decrypt(v0 , v1);
print(v3)
return null;
}
String decrypt(byte[] content , String password){
stirng v4 = null; // "m" string
try{
byte[] v3 = password.getBytes();// "keyStr" byte[]
string v7 = "AES";
v2 = new javax/crypto/spec/SecretKeySpec(v3 , v7);//key :key
v7 = "AES/ECB/NoPadding";
v0 = Cipher.getInstance(v7); //cipher
v7 = 0x2;
Byte[] result = v0.init(v7 , v2).doFinal(content);
v5 = new string(result);
v4 = v5;
return v4;
}catch{
}
}
解密过程中有点瓜皮, 因为是flag 是 aes加密后再base64的 , 所以逆过程的时候,b64decode 出来的结果带有不可见字符,所以不能在线执行直接拿flag,
然后 python 的加密库有点瓜皮 ,我就用了php 来解密(解密库 不在标准php中自带 , 所以使用了php在线执行 :)
<?php
$privateKey = "phrack ctf 2016";
## 标准php 未开启 mcrpt 使用php在线执行 http://www.dooccn.com/php/
// $data = "Test String";
// //加密
// $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv);
// echo(base64_encode($encrypted));
// echo '<br/>';
//解密
$encryptedData = base64_decode("sSNnx1UKbYrA1+MOrdtDTA==");
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_ECB, '');
echo($decrypted);#result : PCTF{Sm4liRiver}
?>