一个人做了所有题,说实话有点累,哎
RE
babynim
和初赛一样的nim语言逆向,die识别出了虚拟机保护但实际上关键代码没有保护,有之前的经验逆起来更简单了,就是输入的字符串转换成大数与一个常数相乘(还伪装得很像一个flag),结果与常数相等。
所以除一下就是flag了。
审计后的代码:
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
| __int64 NimMainModule() { FILE *stdio; String *input; __int64 *v2; String *input_copy; __int64 v4; __int64 checkhello3_copy; __int64 index; String *pre_5_String; String *input_copy_copy; __int64 input_copy_len; __int64 v11; __int64 index_2; __int64 v13; String *flag_content_string; __int64 length; unsigned __int64 v16; __int64 star_des_copy; __int64 v18; unsigned __int64 v19; __int64 unknownProperty; __int64 *p_unknownProperty; __m128i tmp_si128_2; __m128i tmp_si128_1; __int64 star_des_1; __int64 v25;
nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_4); nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_10); nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_11); nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_13); nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_14); nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_15); PutStdio(&TM__xLHv575t3PG1lB5wK05Xqg_2, 1i64); stdio = __acrt_iob_func(0); input = (String *)readLineFromStdio(stdio); input_copy = input; if ( !input ) { if ( ::input_copy ) { unknownProperty = ::input_copy[-1].unknownProperty; p_unknownProperty = &::input_copy[-1].unknownProperty; ::input_copy[-1].unknownProperty = unknownProperty - 8; if ( (unsigned __int64)(unknownProperty - 8) <= 7 ) addZCT__system_5314(refptr_gch__system_5267 + 3, p_unknownProperty); ::input_copy = 0i64; } goto error; } input[-1].unknownProperty += 8i64; if ( ::input_copy && (v4 = ::input_copy[-1].unknownProperty, v2 = &::input_copy[-1].unknownProperty, ::input_copy[-1].unknownProperty = v4 - 8, (unsigned __int64)(v4 - 8) <= 7) ) { addZCT__system_5314(refptr_gch__system_5267 + 3, v2); ::input_copy = input_copy; if ( input_copy->length != 42 ) goto error; } else { ::input_copy = input; if ( input->length != 42 ) { error: checkhello3_copy = check__hello_3; goto error_; } } index = 0i64; pre_5_String = mnewString(5i64, v2); if ( !pre_5_String ) raiseIndexError2(0i64, -1i64); do { if ( (unsigned __int64)index >= pre_5_String->length ) raiseIndexError2(index, pre_5_String->length - 1); if ( (unsigned __int64)index >= input_copy->length ) raiseIndexError2(index, input_copy->length - 1); pre_5_String->content[index] = input_copy->content[index]; ++index; } while ( index <= 4 ); if ( pre_5_String->length != 5 || *(_DWORD *)pre_5_String->content != 1734437990 || pre_5_String->content[4] != 123 ) goto error; input_copy_copy = ::input_copy; if ( !::input_copy ) { v11 = -1i64; LABEL_21: raiseIndexError2(41i64, v11); } input_copy_len = ::input_copy->length; if ( ::input_copy->length <= 0x29ui64 ) { v11 = input_copy_len - 1; goto LABEL_21; } checkhello3_copy = check__hello_3; if ( BYTE1(::input_copy[2].unknownProperty) == '}' ) { index_2 = 0i64; flag_content_string = mnewString(36i64, input_copy_len); if ( !flag_content_string ) raiseIndexError2(0i64, -1i64); do { length = flag_content_string->length; if ( flag_content_string->length <= (unsigned __int64)index_2 ) raiseIndexError2(index_2, length - 1); v16 = index_2 + 5; if ( index_2 + 5 < 0 || v16 < index_2 ) raiseOverflow(v13, length); if ( input_copy_copy->length <= v16 ) raiseIndexError2(index_2 + 5, input_copy_copy->length - 1); flag_content_string->content[index_2++] = input_copy_copy->content[v16]; } while ( index_2 <= 35 ); InitBigInt(flag_content_string, 10i64, &flag_Int); InitBigInt(&Const_String_1, 10i64, &const_string_1_Int); star_des_1 = 0i64; v25 = 0i64; tmp_si128_1 = _mm_loadu_si128((const __m128i *)&flag_Int); tmp_si128_2 = _mm_loadu_si128((const __m128i *)&const_string_1_Int); multiply((__int64)&tmp_si128_1, (__int64)&tmp_si128_2, &star_des_1); star_des_copy = star_des_1; if ( star_des_1 ) *(_QWORD *)(star_des_1 - 16) += 8i64; if ( star_des_copy_copy ) { v18 = star_des_copy_copy - 16; v19 = *(_QWORD *)(star_des_copy_copy - 16) - 8i64; *(_QWORD *)(star_des_copy_copy - 16) = v19; if ( v19 <= 7 ) addZCT__system_5314(refptr_gch__system_5267 + 3, v18); } star_des_copy_copy = star_des_copy; byte_42C188 = v25; genericSeqAssign(&star_des_deep_copy); BYTE8(star_des_deep_copy) = byte_42C188; InitBigInt(&const_String_2, 10i64, &const_string_2_int); tmp_si128_1 = _mm_loadu_si128((const __m128i *)&star_des_deep_copy); tmp_si128_2 = _mm_loadu_si128((const __m128i *)&const_string_2_int); if ( eqeq___6758Z85sersZ65ZOnimbleZpkgsZbigints4548O53O48Zbigints_259(&tmp_si128_1, &tmp_si128_2) ) { check__hello_3 = 1i64; return PutStdio(&String_Win, 1i64); } goto error; } error_: if ( checkhello3_copy != 1 ) return PutStdio(&error_string, 1i64); return PutStdio(&String_Win, 1i64); }
|
exp:
1 2 3 4 5 6 7 8 9 10 11
|
const_one = 56006392793428440965060594343955737638876552919041519193476344215226028549209672868995436445345986471
const_two = 51748409119571493927314047697799213641286278894049840228804594223988372501782894889443165173295123444031074892600769905627166718788675801
print(hex(const_two // const_one))
|
MISC
神秘的日志
两个windows日志文件,审计系统日志后可以发现2022-04-17 11:27:06有一个警告:
打开安全日志,在同一时间黑客成功登陆服务器:
flag:2022-04-17 11:27:06
FORENSIC
手机取证1
使用盘古石手机取证分析系统打开iphone7.zip,可以查看iboot固件版本号
手机取证2
打开压缩包,根目录文件创建时间就是备份完成时间
exe分析_1
使用盘古石计算机取证分析系统挂载受害者安卓手机磁盘,可以发现一个压缩包
解压需要密码,爆破后得到密码virus
提取出services.exe后,放入沙箱
得到创建的可执行文件路径
exe分析_2
文件HackTool.FlyStudio.acz_unpack.exe是否调用了advapi32.dll动态函式链接库?不多bb,直接拖进ida
发现函数导入表存在该链接库
exe分析_3
文件aspnet_wp.v.exe执行后的启动的进程是什么
同理,拖入沙箱
exe分析_4
文件[4085034a23cccebefd374e4a77aea4f1]是什么类型的木马
同理,拖入沙箱
exe分析_5
文件[4085034a23cccebefd374e4a77aea4f1]网络连接的IP地址的归属地是哪个国家
同理,拖入沙箱,查下ip归属地就行
APK分析_02
受害人手机中exec关联服务器地址是
从sdcard磁盘提取出文件
找到mainactivity,解码
APK分析_03
受害人手机中exec加载服务器的函数是
找到调用t()的函数
APK分析_05
受害人手机中exec的是否有安全检测行为?
进入应用会提示环境安全,当然有了
APK分析_06
受害人手机中exec的检测方法的完整路径和方法名是
这不是初赛原题吗
APK分析_07
受害人手机中exec有几个界面
去清单文件里数一下
应该是3个,反正对了
APK分析_08
受害人手机中红星IPA的包名是
把ipa安装包解压之后有个info.plist,里面有包名
APK分析_09
受害人手机中红星IPA的APIKEY是
同样在文件里
APK分析_10
受害人手机中红星IPA的权限有哪些?
同样的文件,数一下就知道了4个
APK分析_12
嫌疑人手机中红星APK的程序入口是
拖入gda
APK分析_13
嫌疑人手机中分析聊天工具,服务器的登录端口是
首先你把这个文件导出来
然后安装,打开就是登录界面,有个网络设置,默认有个6661端口,就是这个
APK分析_15
结合手机流量分析聊天工具的登录账号和密码是
用fiddler看下流量吧
找了好久找到可疑相应包,密码应该是哈希,查下表
就这垃圾数据cmd5还要钱,真坑
服务器取证_06
写出涉案网站(维斯塔斯)的运行目录路径
请出奇安信的计算机仿真取证系统,挂载服务器的磁盘,启动后是一个centos
然后看下宝塔的nginx配置文件就知道路径了,但是多了一个public,容易坑