-
-
[讨论]buuctf两道休闲题(2021羊城杯babysmc,Crakme)
-
2022-5-10 21:31 5589
-
2021羊城杯babysmc
SMC概念
1 2 3 4 5 | 提前将重要的代码节进行加密,或将加密数据提前存放在内存中,并且配有一个解密函数。 再静态调试中很难观察出有用的信息 这种加密算法可以被用来做免杀,防止特征码被查杀 特征:在汇编代码中夹杂大片的数据 |
解题过程
打开程序按顺序分析发现这一步有一个直接访问内存的Call
执行call之后下方数据发生变化
从自解密函数向下找,找到所属的retn,将retn包含的函数体框起来,右键按照图里操作
出现这个窗口选择force,之后就能F5了
跟随动态调试进入解密后的函数,这个程序是变形的base64
四个字母为一组,右移0,2,4,6后,作为v95的角标,分别和0xA6,0XA3,0XA9,0XAC做与运算
输入数组做完以上运算和v84做比较
脚本思路
先将字符串四个一组做与运算的反运算
然后和v95数组内的值比较,得到对应的角标
将角标字符串做base64反向编码
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 | #include <stdio.h> #include <string.h> int main(void) { unsigned char key[] = "H>oQn6aqLr{DH6odhdm0dMe`MBo?lRglHtGPOdobDlknejmGI|ghDb<4" ; int data[] = { 0xE4 , 0xC4 , 0xE7 , 0xC7 , 0xE6 , 0xC6 , 0xE1 , 0xC1 , 0xE0 , 0xC0 , 0xE3 , 0xC3 , 0xE2 , 0xC2 , 0xED , 0xCD , 0xEC , 0xCC , 0xEF , 0xCF , 0xEE , 0xCE , 0xE9 , 0xC9 , 0xE8 , 0xC8 , 0xEB , 0xCB , 0xEA , 0xCA , 0xF5 , 0xD5 , 0xF4 , 0xD4 , 0xF7 , 0xD7 , 0xF6 , 0xD6 , 0xF1 , 0xD1 , 0xF0 , 0xD0 , 0xF3 , 0xD3 , 0xF2 , 0xD2 , 0xFD , 0xDD , 0xFC , 0xDC , 0xFF , 0xDF , 0x95 , 0x9C , 0x9D , 0x92 , 0x93 , 0x90 , 0x91 , 0x96 , 0x97 , 0x94 , 0x8A , 0x8E }; int xr[] = { 0xA6 , 0xA3 , 0xA9 , 0xAC }; int i, j; unsigned int v3; int flag[ 100 ] = { 0 }; for (i = 0 ; i < 56 ; i + + ) { key[i] ^ = xr[i % 4 ]; / / printf( "%d " ,key[i]); } / / printf( "\n" ); for (i = 0 ; i < 56 ; i + + ) for (j = 0 ; j < 64 ; j + + ) if (key[i] = = data[j]) { key[i] = j; / / printf( "%d:%d " ,i,j); break ; } for (i = 0 , j = 0 ; i < 56 ; i + = 4 , j + = 3 ) { v3 = key[i + 3 ] + (key[i + 2 ] << 6 ) + (key[i + 1 ] << 12 ) + (key[i] << 18 ); flag[j] = (v3 >> 16 ) & 0xFF ; flag[j + 1 ] = (v3 >> 8 ) & 0xFF ; flag[j + 2 ] = v3 & 0xFF ; } for (i = 0 ; i < 100 ; i + + ) printf( "%c" ,flag[i]); return 0 ; } |
Buuctf Crakme
Mains
v3返回值恒定是1
sub_CE1830的返回值为1 ——>Format
format=congratulation
v4=pleace try again
Sub_CE1830
Sub_CE1470
脚本
1 2 3 4 | box = [ 0x2a , 0xd7 , 0x92 , 0xe9 , 0x53 , 0xe2 , 0xc4 , 0xcd ] a = [ 100 , 98 , 97 , 112 , 112 , 115 , 101 , 99 ] for i in range ( 8 ): print ( hex (a[i]^box[i])[ 2 :],end = '') |
博客:https://qwer597.github.io/
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2022-6-15 10:57
被wx_好一脚头球编辑
,原因:
赞赏
他的文章
看原图