西普ctf 逆向题Writeup
一、你知道注册码吗
用户名和注册码的比较运算用ida可以很清楚的逆向出:
1 2 3 4 5 |
for ( i = 0; i < (signed int)strlen(username); ++i ) { if ( password[i] != i + username[i] - strlen(username) ) break; } |
根据用户名为syclover就可以获取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 |
.method private instance void Button1_Click(object sender, class [mscorlib]System.EventArgs e) // DATA XREF: WindowsApplication1.Form1__set_Button1+2r { .maxstack 3 .locals init (string V0) ldarg.0 callvirt instance class [System.Windows.Forms]System.Windows.Forms.TextBox WindowsApplication1.Form1::get_TextBox1() callvirt instance string [System.Windows.Forms]System.Windows.Forms.TextBox::get_Text() call string [Microsoft.VisualBasic]Microsoft.VisualBasic.Strings::Trim(string) stloc.0 ldloc.0 ldstr aZhimakaimen@20 // "zhimakaimen@2011" ldc.i4.0 call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Operators::CompareString(string, string, bool) ldc.i4.0 bne.un.s loc_7B3 ldstr asc_1160 // "通关密语正确!" ldc.i4.0 ldstr asc_1134 // "通关密语" call valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxResult [Microsoft.VisualBasic]Microsoft.VisualBasic.Interaction::MsgBox(object, valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxStyle, object) pop br.s loc_7C4 loc_7B3: // CODE XREF: WindowsApplication1.Form1__Button1_Click+1Ej ldstr asc_1170 // "通关密语错误!" ldc.i4.0 ldstr asc_1134 // "通关密语" call valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxResult [Microsoft.VisualBasic]Microsoft.VisualBasic.Interaction::MsgBox(object, valuetype [Microsoft.VisualBasic]Microsoft.VisualBasic.MsgBoxStyle, object) pop loc_7C4: // CODE XREF: WindowsApplication1.Form1__Button1_Click+31j ret } |
zhimakaimen@2011通关密语,提交上去就能获取flag
三、该题不简单
关键运算:
1 2 3 4 5 6 7 8 9 10 11 12 |
if ( strlen(String) != 0 ) { do { *(&String2 + v1) = (v1 + v1 * String[v1] * String[v1]) % 0x42 + 33; ++v1; } while ( v1 < strlen(String) ); } strcpy(String, "Happy@"); lstrcatA(String, &String2); result = lstrcmpA(password, String) != 0; |
注册码为hello就能获取flag
四、此处无声
程序加了壳,dump后用ida分析,发现涉及到RC6和md5相关加密,
RC6Decrypt(MD5(username))的16进制输出即为注册码。具体算法如下:
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 |
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned int uint; int w = 32; int b = 16; //16,24,32 int r = 20; uint P32 = 0xB7E15163; uint Q32 = 0x9E3779B9; int bytes = w / 8; int c = (b + bytes - 1) / bytes; int R24 = 2 * r + 4; int lgw = 5; uint *S=(uint*)"\x7A\x75\xD4\x63\xB4\x3C\x7A\xEE\x7A\x02\x00\x6D\x0F\xB7\x31\x88\x75\xD9\x28\x77\x56\x41\xBA\xE7\xAD\xBF\x92\xDC\x7B\x96\x17\xCB" "\x7A\x0D\x8B\x1F\x4F\x0D\x0B\x8E\x51\x96\x1C\x43\x7F\x3C\x29\x22\x45\x38\x24\x0D\xA6\x7B\x3C\xC2\x2E\x23\xAD\x4C\xFF\x36\x5D\xB3" "\x15\xC0\x1B\x55\x67\xCF\xF3\x0B\x46\x2D\xAF\xDD\x0D\xA8\x2A\xA7\xD4\x33\x1C\xEC\x6B\x73\x6B\x89\x20\x7F\x9D\x18\xBE\x20\x6D\xE4" "\xCC\xD5\xDD\xC4\xA7\xA1\xBB\x3D\xB8\x2D\x69\x8A\xC4\x98\xB5\xEE\x0C\x8B\xA8\x0A\x1A\xA1\x06\xF5\x57\x8F\xC6\xAD\x28\xE9\x39\x17" "\xDA\x03\x78\x57\x6A\x41\x8F\x95\xA7\x7C\x1C\xDF\xFE\xD3\xBA\x0B\x9C\xB3\x6D\xAB\x75\x80\x04\xB8\xBB\x8A\x62\x92\x07\x95\xEB\x5C" "\x7C\xA6\xCC\x64\xA6\x10\x0B\xD0\x73\x10\x18\xD4\x49\x77\x14\x9E\x00\x00\x00\x00"; int keyLen; uint ROTL(uint x, uint y) { return ((x << (int)(y & (w - 1))) | (x >> (int)(w - (y & (w - 1))))); } uint ROTR(uint x, uint y) { return ((x >> (int)(y & (w - 1))) | (x << (int)(w - (y & (w - 1))))); } void RC6Setup(char* K, int b) { int i, j, s, v; uint* L = new uint[b]; /* Big enough for max b */ uint A, B; L[b - 1] = 0; for (i = 15 - 1; i >= 0; i--) L[i / bytes] = (L[i / bytes] << 8) + K[i]; S[0] = P32; for (i = 1; i <= 2 * r + 3; i++) S[i] = S[i - 1] + Q32; A = B = 0; i = j = 0; v = R24; if (c > v) v = c; v *= 3; for (s = 1; s <= v; s++) { A = S[i] = ROTL(S[i] + A + B, 3); B = L[j] = ROTL(L[j] + A + B, A + B); i = (i + 1) % R24; j = (j + 1) % c; } delete[] L; } void RC6Encrypt(char* buf) { uint *buffer=(uint*)buf; uint A = buffer[0]; uint B = buffer[1]; uint C = buffer[2]; uint D = buffer[3]; B += S[0]; D += S[1]; for (int j = 2; j <= 2 * r; j += 2) { uint t = ROTL(B * (2 * B + 1), lgw); uint u = ROTL(D * (2 * D + 1), lgw); A = ROTL(A ^ t, u) + S[j]; C = ROTL(C ^ u, t) + S[j + 1]; uint x = A; A = B; B = C; C = D; D = x; } A += S[2 * r + 2]; C += S[2 * r + 3]; buffer[0]=A; buffer[1]=B; buffer[2]=C; buffer[3]=D; } void RC6Decrypt(char* buf) { uint *buffer=(uint*)buf; uint A = buffer[0]; uint B = buffer[1]; uint C = buffer[2]; uint D = buffer[3]; C -= S[2 * r + 3]; A -= S[2 * r + 2]; for (int j = 2 * r; j >= 2; j -= 2) { uint x = D; D = C; C = B; B = A; A = x; uint u = ROTL(D * (2 * D + 1), lgw); uint t = ROTL(B * (2 * B + 1), lgw); C = ROTR(C - S[j + 1], t) ^ u; A = ROTR(A - S[j], u) ^ t; } D -= S[1]; B -= S[0]; buffer[0]=A; buffer[1]=B; buffer[2]=C; buffer[3]=D; } void printBuffer(unsigned char* buffer,int size) { for(int i=0;i<size;i++) { printf("%02X",buffer[i]); } printf("\n"); } char *key="\x35\x47\x82\x5C\x33\x8C\x85\x77\x9A\x67\x45\x7A\x6D\x5C\x16\x47"; char *buf="\xB9\xB7\xDD\x1C\x42\x1E\x00\x5B\xC9\xA7\xF7\x0B\x84\x8E\x3D\x0E"; void main() { //RC6Setup(key,16); char buf0[16]; memcpy(buf0,buf,16); //RC6Encrypt(buf0); RC6Decrypt(buf0); printBuffer((unsigned char *)buf0,16); } |
五、证明自己吧
关键部分:
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 |
signed int __cdecl verity(const char *key) { unsigned int v1; // edx@2 unsigned int v2; // edx@4 unsigned int v3; // edx@6 char str0[14]; // [sp+Ch] [bp-10h]@1 strcpy(str0, "hW\x19HPnXxTj\x19X^\x06"); if ( strlen(key) == strlen(str0) ) { v1 = 0; if ( strlen(key) != 0 ) { do key[v1++] ^= 0x20u; while ( v1 < strlen(key) ); } v2 = 0; if ( strlen(str0) != 0 ) { do str0[v2++] -= 5; while ( v2 < strlen(str0) ); } v3 = 0; if ( strlen(str0) == 0 ) return 1; while ( *(&str0[v3] + key - str0) == str0[v3] ) { ++v3; if ( v3 >= strlen(str0) ) return 1; } } return 0; } |
算法很简单,得出key即为flag。
六、你会吗
这题直接就很看到flag:
1 |
_mm_storeu_si128((__m128i *)&v4, _mm_loadu_si128((const __m128i *)"DUTCTF{We1c0met0DUTCTF}")); |
七、考验你能力的时候到了
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 |
int __usercall sub_401000@<eax>(char a1@<sil>) { signed int v1; // ecx@1 char *v2; // eax@2 __int128 *v3; // eax@8 int v4; // esi@10 char v5; // al@11 char v7; // [sp-4h] [bp-68h]@10 char v8[32]; // [sp+0h] [bp-64h]@1 __int128 v9; // [sp+20h] [bp-44h]@1 int v10; // [sp+30h] [bp-34h]@1 __int16 v11; // [sp+34h] [bp-30h]@1 __int64 v12; // [sp+36h] [bp-2Eh]@1 __int128 v13; // [sp+40h] [bp-24h]@1 __int64 v14; // [sp+50h] [bp-14h]@1 __int16 v15; // [sp+58h] [bp-Ch]@1 int v16; // [sp+5Ah] [bp-Ah]@1 v15 = *(_WORD *)"}"; _mm_storeu_si128((__m128i *)&v13, _mm_loadu_si128((const __m128i *)"DVVFXK{Ig45tI(oNs|Hbjdlf}")); v10 = *(_DWORD *)"owkow"; _mm_storel_epi64((__m128i *)&v14, _mm_loadl_epi64((const __m128i *)"s|Hbjdlf}")); v16 = 0; _mm_storeu_si128((__m128i *)&v9, _mm_loadu_si128((const __m128i *)"kowkowkowkowkowkowkow")); v11 = *(_WORD *)"w"; _mm_storel_epi64((__m128i *)&v12, 0i64); sub_4012D1("你懂的:", v8[0]); sub_401127("%s", v8); v1 = 0; if ( v8[0] ) { v2 = v8; do { *v2++ += v1; if ( v1 >= 5 ) v1 = 0; else ++v1; } while ( *v2 ); } if ( (_BYTE)v9 ) { v3 = &v9; do { ++*(_BYTE *)v3; v3 = (__int128 *)((char *)v3 + 1); } while ( *(_BYTE *)v3 ); } v7 = a1; v4 = 0; if ( (_BYTE)v13 ) { while ( 1 ) { v5 = v8[v4]; if ( !v5 || *((_BYTE *)&v13 + v4) != v5 ) break; ++v4; if ( !*((_BYTE *)&v13 + v4) ) goto LABEL_16; } sub_4012D1("flag不对呦,再试试呀,加油!\n", v7); } LABEL_16: if ( !*((_BYTE *)&v13 + v4) ) sub_4012D1("这就是我要的flag!!!\n", v8[0]); sub_4011C7("pause"); return 0; } |
算法简单,不难获取flag。
八、FALG
题目是一串很长的js脚本:
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 |
a[11]-a[5]%a[1]*a[12]%a[14]-a[6]*a[7]-a[24]+a[10]%a[13]+a[2]*a[23]+a[21]+a[15]%a[3]%a[19]-a[20]*a[0]%a[17]+a[18]-a[22]+a[8]+a[4]-a[9]+a[25]+a[16]==-161 a[14]+a[19]%a[20]-a[3]-a[4]+a[5]%a[23]%a[12]%a[21]-a[18]%a[24]%a[0]+a[6]*a[17]-a[7]*a[9]-a[10]+a[8]+a[22]*a[15]%a[16]-a[26]-a[1]%a[11]+a[2]+a[25]+a[13]==-42 a[34]+a[27]+a[29]-a[10]*a[13]*a[20]%a[31]+a[2]*a[23]-a[0]*a[8]-a[6]*a[9]-a[19]%a[3]+a[15]%a[1]-a[25]-a[26]*a[16]%a[30]-a[17]+a[12]+a[5]-a[33]+a[21]+a[24]*a[14]+a[11]*a[32]-a[22]*a[4]+a[18]+a[28]-a[7]==-56 a[20]+a[13]%a[4]-a[21]+a[16]-a[12]+a[11]%a[9]%a[3]%a[0]*a[8]%a[2]+a[5]%a[17]+a[15]-a[10]%a[18]-a[6]-a[1]-a[19]*a[7]%a[14]==-76 a[6]%a[29]+a[4]+a[18]%a[22]+a[16]+a[30]-a[19]*a[21]+a[24]+a[5]-a[34]*a[13]+a[17]*a[11]-a[31]*a[23]+a[14]+a[28]+a[20]-a[10]+a[32]+a[33]%a[12]*a[26]+a[2]%a[15]*a[1]+a[27]*a[25]-a[3]%a[7]%a[8]*a[9]-a[0]+a[35]==-129 a[1]*a[3]*a[5]%a[6]-a[2]%a[0]+a[4]-a[7]==18 a[19]+a[20]+a[4]+a[0]-a[17]-a[8]-a[2]*a[7]+a[18]-a[14]-a[3]-a[5]+a[10]-a[11]+a[6]*a[1]%a[13]%a[15]*a[12]-a[9]-a[16]==-36 a[6]-a[1]+a[4]+a[0]%a[5]%a[2]-a[3]==21 a[1]-a[5]%a[4]%a[8]%a[3]-a[10]-a[0]%a[7]%a[9]%a[6]-a[2]==-157 a[9]%a[5]-a[11]+a[7]-a[0]%a[10]*a[4]%a[3]+a[1]-a[6]%a[8]+a[2]==99 a[1]+a[4]%a[0]%a[3]*a[7]%a[6]-a[8]-a[2]+a[5]==127 a[8]+a[34]%a[10]%a[4]%a[16]+a[25]+a[15]-a[31]-a[2]*a[3]-a[27]*a[13]%a[23]%a[1]+a[17]*a[26]+a[5]%a[30]+a[35]%a[36]+a[22]%a[7]%a[29]-a[21]+a[28]*a[18]-a[37]+a[38]+a[11]%a[20]+a[9]-a[32]-a[0]*a[14]+a[33]*a[12]+a[24]-a[19]+a[6]==4 a[2]-a[1]-a[3]+a[0]==-12 a[6]%a[25]%a[17]+a[24]-a[23]+a[15]%a[31]*a[13]+a[29]-a[12]%a[0]*a[11]-a[27]+a[5]-a[2]-a[10]%a[28]*a[14]-a[8]+a[7]*a[22]+a[26]+a[3]%a[21]+a[32]-a[20]*a[4]+a[30]+a[18]*a[16]-a[9]%a[1]%a[19]==132 a[17]-a[11]+a[1]-a[0]%a[5]*a[12]%a[13]+a[4]%a[14]-a[10]-a[15]%a[8]%a[7]+a[6]-a[2]%a[16]+a[9]+a[3]==128 a[28]+a[19]*a[9]+a[26]%a[5]-a[22]+a[3]%a[4]+a[12]%a[0]+a[25]%a[2]%a[13]-a[15]+a[23]%a[21]*a[27]%a[20]%a[16]%a[11]+a[24]%a[7]-a[6]*a[1]-a[14]+a[18]+a[10]%a[8]-a[17]==-43 a[11]*a[2]%a[19]*a[6]-a[14]+a[32]*a[1]%a[28]-a[3]%a[27]-a[4]+a[13]+a[24]%a[12]-a[10]+a[23]-a[15]%a[0]%a[31]%a[16]-a[17]*a[7]%a[21]%a[20]%a[25]*a[8]+a[22]*a[18]%a[5]-a[26]+a[33]+a[9]%a[30]%a[29]==87 a[11]*a[17]%a[16]-a[18]%a[13]+a[10]+a[0]%a[5]-a[23]+a[15]*a[21]%a[20]+a[9]+a[7]-a[19]*a[2]-a[24]+a[1]*a[14]+a[6]%a[4]%a[8]%a[3]-a[22]-a[12]==-130 a[1]-a[3]-a[6]*a[9]%a[13]-a[18]+a[2]*a[12]*a[7]%a[0]-a[16]+a[17]-a[4]*a[5]%a[14]+a[10]*a[11]*a[15]%a[8]==-123 a[14]-a[26]-a[21]+a[34]%a[15]+a[9]+a[19]%a[13]+a[36]+a[18]%a[11]*a[12]%a[30]+a[29]+a[31]%a[17]-a[5]*a[24]*a[20]%a[8]%a[22]-a[4]-a[25]%a[10]-a[6]-a[3]-a[0]*a[23]%a[35]+a[28]%a[16]%a[32]%a[2]+a[33]-a[1]*a[27]%a[7]==-75 a[31]%a[38]+a[23]%a[33]-a[10]*a[3]+a[5]+a[35]-a[20]%a[27]*a[13]+a[30]%a[14]*a[1]%a[6]+a[37]%a[4]-a[26]*a[21]-a[7]-a[36]-a[16]*a[0]+a[28]*a[34]*a[42]*a[41]%a[9]-a[15]+a[19]*a[24]+a[11]*a[17]+a[39]%a[32]+a[43]+a[18]*a[2]-a[12]-a[25]-a[29]-a[22]+a[8]*a[40]==123 a[4]*a[3]%a[2]%a[0]-a[5]+a[1]==48 a[25]-a[30]+a[16]-a[37]-a[21]*a[36]*a[4]%a[11]+a[32]-a[29]%a[34]-a[2]+a[20]%a[1]+a[10]-a[33]+a[0]%a[19]-a[22]+a[8]+a[13]%a[31]+a[17]%a[24]%a[7]+a[26]-a[3]%a[14]%a[12]*a[5]%a[18]-a[23]*a[6]%a[28]+a[15]-a[35]+a[27]%a[9]==21 a[2]-a[4]+a[3]%a[0]+a[1]==83 a[7]*a[21]*a[12]%a[3]-a[17]-a[38]+a[23]+a[6]%a[28]%a[27]%a[14]%a[39]+a[13]+a[32]+a[40]-a[4]-a[8]%a[11]%a[25]*a[31]+a[20]*a[24]%a[29]%a[34]*a[30]%a[33]%a[5]-a[26]*a[18]%a[2]+a[10]+a[36]*a[9]%a[37]*a[19]-a[15]*a[1]%a[35]%a[22]%a[16]-a[0]==75 a[27]*a[29]*a[11]%a[8]-a[24]*a[16]+a[10]%a[2]%a[7]*a[6]+a[23]+a[0]+a[4]*a[22]-a[30]+a[12]-a[17]%a[5]%a[1]*a[15]-a[19]*a[20]-a[3]-a[9]-a[13]+a[25]*a[18]%a[14]+a[26]%a[28]*a[21]==19 a[45]-a[9]%a[42]-a[0]+a[44]%a[20]*a[13]-a[38]%a[36]*a[17]+a[24]+a[31]+a[28]-a[7]%a[16]*a[39]*a[25]*a[1]%a[14]*a[41]-a[18]-a[4]-a[3]%a[10]+a[23]%a[12]+a[37]*a[29]%a[2]+a[30]-a[22]+a[32]%a[34]+a[33]+a[8]%a[26]*a[11]*a[15]%a[40]%a[5]%a[19]-a[21]+a[43]%a[6]*a[35]+a[27]==-76 a[7]+a[9]+a[1]-a[11]*a[5]*a[3]%a[12]-a[13]-a[4]-a[6]+a[8]%a[2]%a[0]%a[10]==-84 a[0]-a[1]==-6 a[2]-a[6]%a[8]+a[7]-a[4]-a[1]%a[3]+a[9]-a[5]+a[0]==50 a[44]-a[24]+a[25]%a[30]%a[41]*a[3]-a[23]+a[20]*a[38]+a[15]-a[43]+a[8]-a[29]*a[9]+a[27]+a[33]-a[39]*a[18]%a[0]+a[7]-a[6]-a[42]-a[2]+a[31]+a[4]-a[32]*a[40]-a[22]+a[13]+a[34]%a[17]*a[14]%a[37]+a[36]-a[10]*a[5]%a[11]*a[19]+a[12]+a[16]%a[35]*a[21]+a[28]-a[26]-a[1]==-44 a[9]%a[3]%a[7]%a[0]%a[4]-a[2]-a[11]-a[12]+a[6]-a[5]%a[10]+a[8]-a[1]==-187 a[8]%a[7]+a[6]-a[14]-a[4]%a[17]+a[11]-a[12]%a[5]%a[2]+a[15]-a[9]%a[10]*a[13]%a[0]-a[18]+a[19]+a[16]-a[3]-a[1]==-7 a[12]%a[3]+a[15]-a[0]-a[11]+a[13]+a[4]*a[2]%a[1]-a[10]-a[5]+a[9]+a[6]%a[7]*a[8]%a[14]==-22 a[4]+a[16]+a[10]+a[5]-a[7]-a[11]-a[9]%a[13]-a[1]-a[12]%a[2]*a[14]%a[8]%a[6]+a[3]-a[15]%a[0]==97 a[0]*a[1]%a[11]*a[14]%a[10]+a[5]+a[7]%a[13]-a[4]%a[19]-a[15]-a[8]%a[18]%a[21]%a[12]%a[17]-a[3]%a[9]-a[6]+a[20]+a[16]+a[22]-a[2]==112 a[0]==102 a[2]+a[0]-a[1]==91 a[5]*a[4]%a[12]+a[18]+a[27]+a[22]+a[21]-a[10]-a[25]-a[20]%a[7]+a[14]%a[17]%a[23]+a[19]*a[13]%a[26]-a[1]*a[3]%a[8]+a[24]-a[6]+a[16]+a[0]-a[9]-a[15]%a[2]-a[11]==163 a[8]*a[10]*a[4]*a[21]%a[26]*a[6]%a[14]+a[22]*a[5]+a[18]-a[25]-a[7]-a[11]+a[23]-a[9]*a[15]-a[2]+a[28]%a[17]*a[1]%a[0]-a[3]%a[16]-a[12]*a[20]+a[29]+a[27]%a[24]%a[19]-a[13]==-46 a[21]-a[36]-a[16]+a[28]-a[3]%a[1]+a[35]-a[8]-a[30]+a[29]%a[19]+a[39]-a[2]+a[24]*a[11]%a[34]%a[15]%a[38]%a[12]-a[33]+a[20]%a[14]-a[18]-a[31]+a[5]%a[10]+a[7]+a[4]%a[26]*a[23]+a[27]-a[6]*a[37]%a[17]*a[25]%a[9]%a[22]-a[0]*a[13]%a[32]==184 a[38]*a[34]%a[30]-a[31]+a[26]-a[27]-a[16]%a[0]-a[18]%a[24]%a[29]%a[12]+a[20]-a[15]*a[7]+a[17]-a[13]-a[36]-a[25]%a[8]*a[22]+a[6]-a[35]%a[39]+a[9]%a[3]%a[10]%a[19]*a[37]+a[40]%a[28]+a[41]-a[2]*a[23]*a[4]%a[1]-a[32]%a[14]%a[11]*a[21]%a[5]+a[33]==167 a[13]-a[6]%a[5]-a[0]%a[9]+a[21]+a[23]+a[18]%a[17]%a[16]%a[7]-a[20]%a[1]*a[15]%a[19]%a[8]*a[2]%a[22]-a[14]%a[11]%a[10]*a[4]%a[3]+a[12]==155 a[23]+a[26]%a[17]%a[20]*a[39]-a[7]-a[0]-a[27]*a[15]+a[25]%a[18]%a[16]%a[42]%a[32]+a[6]*a[14]-a[2]-a[36]+a[35]+a[29]+a[34]-a[31]-a[5]+a[41]%a[3]*a[13]*a[10]%a[12]-a[21]*a[38]%a[24]-a[46]+a[33]%a[4]%a[11]*a[40]%a[44]+a[28]-a[22]%a[30]+a[8]-a[19]-a[1]*a[43]*a[37]%a[45]+a[9]==183 a[22]%a[18]+a[12]*a[23]-a[41]*a[17]+a[15]-a[5]%a[25]-a[14]%a[16]-a[3]+a[36]+a[1]-a[42]+a[26]%a[39]%a[10]+a[28]%a[27]-a[7]-a[30]-a[19]%a[2]+a[32]%a[0]-a[6]+a[11]-a[13]%a[35]*a[29]-a[4]*a[24]*a[37]%a[40]+a[31]%a[33]*a[38]-a[21]+a[8]*a[34]%a[20]*a[9]==39 a[6]%a[0]*a[9]%a[2]%a[4]%a[10]-a[14]+a[13]%a[11]-a[8]%a[5]+a[7]+a[12]+a[1]-a[3]==163 a[13]-a[15]+a[23]*a[17]*a[27]%a[8]-a[14]%a[22]-a[29]*a[5]%a[25]+a[4]%a[10]-a[19]%a[7]%a[12]%a[11]+a[20]+a[31]+a[18]+a[21]*a[30]%a[1]%a[28]+a[0]%a[26]+a[6]%a[24]%a[3]-a[2]-a[16]-a[9]==147 |
从中可以找到一些规律:每条运算都可以获取到一个数组的值,每条运算中下标最大的数组值就是该条运算可以获取的,从下标0开始可以依次获取所有数组的值。具体解密脚本如下:
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 |
import os,sys input=open("input.txt","r") dd={} for ll in input: line=ll.replace("\n","") max=-1 index=-1 while 1: index=line.find("[",index+1) if index==-1: break index0=line.find("]",index+1) p=int(line[index+1:index0]) if p>max: max=p if max!=-1: aastr="a["+str(max)+"]" index=line.find(aastr) index0=line.find("==") if index==-1: print "error" if index==0: dd[max]="-("+line[:index0].replace(aastr,"0")+"-("+line[index0+2:]+"))" elif line[index-1]=='-': dd[max]=line[:index0].replace(aastr,"0")+"-("+line[index0+2:]+")" elif line[index-1]=='+': dd[max]="-("+line[:index0].replace(aastr,"0")+"-("+line[index0+2:]+"))" else: print error #print aastr,"=",dd[max] input.close() out="" for i in range(0,47): xx=eval(dd[i]); out+=chr(xx) print "a[",i,"] =",xx for j in range(i+1,47): dd[j]=dd[j].replace("a["+str(i)+"]",str(xx)) print out |
九、有一个程序可以得到如下密文
一个pyc文件没有经过混淆,可以直接反编译获取到源码:
1 2 3 4 5 6 7 8 9 10 11 12 |
for i in range(1, len(sys.argv), 2): a = sys.argv[i] b = sys.argv[i + 1] if a == '-t': ex = int(b) elif a == '-e': encoded = authcode(b, 'ENCODE', expiry=ex) print encoded elif a == '-d': print b decoded = authcode(b, 'DECODE', expiry=ex) print decoded |
发现使用-d就能进行解码获取flag
十、这个flag有点怪
Apk加了不少反调试,以及检测不通过直接退出。通过静态分析也能获取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 |
strXctf="syc"#"xctf" strror=6 str0="a8e5588f7e3f758" """ a3=2*(a9-1) a3=a0+29 a10=a9+31 a0+a3+a9+a10=304 a3-29+a3+a9+a9+31=304 4*(a9-1)-29+2*a9+31=304 6*a9-2=304 a9=51 a3=100 a0=71 a10=82 """ tmpstr0x_0_3="Good" tmpstr0x_9_10="3R" ss0="Rdru^" tmpstr0x_4_8="" for i in range(0,5): tmpstr0x_4_8+=chr((ord(ss0[i])-i)^0x11) tmpstr0x_0_10=tmpstr0x_0_3+tmpstr0x_4_8+tmpstr0x_9_10 print tmpstr0x_0_10 ss1=range(0,256) ss1.append(0) ss1.append(0) v5=0 v8=0 tmpstr_seed=tmpstr0x_0_10[8:11] #print tmpstr_seed for i in range(0,256): v9=ss1[i] v5=(ord(tmpstr_seed[v8])+v9+v5)&0xFF ss1[i]=ss1[v5] ss1[v5]=v9 v8=(v8+1)%len(strXctf)&0xFF ss1_0="" for s in ss1: ss1_0+=hex(s)+' ' print ss1_0,"\n" def isVaildString(s): for c in s: if (ord(c)<32 or ord(c)>126): return False return True str2="" ss2=ss1 for i in range(0,16): ss1_0="" str0_0=str0[:i]+'0'+str0[i:] print str0_0 str1=str0_0.decode('hex') v3=ss1[256] v5=ss1[257] ss1=ss2[0:] for c in str1: v3=(v3+1)&0xFF v6=ss1[v3] v5=(v6+v5)&0xFF ss1[v3]=ss1[v5] ss1[v5]=v6 ss1_0+=chr(ord(c)^ss1[(v6+ss1[v3])&0xFF]) if isVaildString(ss1_0): print str0_0,ss1_0 break tmpstr0x_pad=ss1_0 tempstr0=tmpstr0x_0_10+tmpstr0x_pad str3="" for i in range(0,len(tempstr0)): if tempstr0[i].isalpha(): if tempstr0[i].isupper(): str3+=chr((ord(tempstr0[i])+(26-(ord(strXctf[i%len(strXctf)])-ord('a')))-ord('A'))%26+ord('A')) else: str3+=chr((ord(tempstr0[i])+(26-(ord(strXctf[i%len(strXctf)])-ord('a')))-ord('a'))%26+ord('a')) else: str3+=tempstr0[i] print str3 for i in range(0,strror): str3=str3[1:]+str3[0] print str3 str4="" for i in range(1,len(str3)+1): str4+=chr(ord(str3[i-1])^i) print str4 print "xctf{"+str4+"}" |
十一、babyCrack
C#写的CrackMe,Reflector反编译就能看到源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private void button1_Click(object sender, EventArgs e) { bool flag = false; Config.user = this.textBox1.Text; string user = Config.user; string str2 = "hctf{bABy_CtsvlmE_!}"; if (str2.CompareTo(user) == 0) { flag = true; } if (flag) { MessageBox.Show("good !!!"); } } |
十二、wzwzDingDing
此题是win64驱动题,经过分析填充完善shellcode使其能运行,所需填充的数据即为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 |
void __fastcall sub_12250(__int64 a1) { char *v1; // rdi@1 __int64 (__fastcall *v2)(); // rsi@1 signed __int64 i; // rcx@1 char *v4; // rsi@7 PVOID v5; // rdi@7 signed __int64 k; // rcx@7 __int64 v7; // [sp+0h] [bp-C8h]@10 PVOID P; // [sp+20h] [bp-A8h]@7 int j; // [sp+28h] [bp-A0h]@4 char v10; // [sp+40h] [bp-88h]@1 char v11; // [sp+47h] [bp-81h]@4 char v12; // [sp+48h] [bp-80h]@4 char v13; // [sp+58h] [bp-70h]@4 char v14; // [sp+59h] [bp-6Fh]@4 char v15; // [sp+5Ah] [bp-6Eh]@4 char v16; // [sp+5Bh] [bp-6Dh]@4 char v17; // [sp+97h] [bp-31h]@4 char v18; // [sp+99h] [bp-2Fh]@4 __int64 v19; // [sp+A0h] [bp-28h]@10 __int64 v20; // [sp+D0h] [bp+8h]@1 v20 = a1; v1 = &v10; v2 = shellcode; for ( i = 91i64; i; --i ) { *v1 = *(_BYTE *)v2; v2 = (__int64 (__fastcall *)())((char *)v2 + 1); ++v1; } v10 = *(_BYTE *)v20; // 完善shellcode // v11 = *(_BYTE *)(v20 + 1); v12 = *(_BYTE *)(v20 + 2); v13 = *(_BYTE *)(v20 + 3); v14 = *(_BYTE *)(v20 + 4); v15 = *(_BYTE *)(v20 + 5); v16 = *(_BYTE *)(v20 + 6); v17 = *(_BYTE *)(v20 + 7); v18 = *(_BYTE *)(v20 + 8); for ( j = 0; j < 91; ++j ) ; P = ExAllocatePool(0, 0x5Bui64); v4 = &v10; v5 = P; for ( k = 91i64; k; --k ) { *(_BYTE *)v5 = *v4++; v5 = (char *)v5 + 1; } ((void (__fastcall *)(__int64))P)(v20); ExFreePoolWithTag(P, 0); sub_11BB0((__int64)"OK!YOU ARE REALLY GOOD!Also, there is a } left!", 0x2Fu); sub_12B40((unsigned __int64)&v7 ^ v19); } |
未完善的shellcode:
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 |
byte_12D90 db 10h ; DATA XREF: sub_12250+25o .text:0000000000012D91 ; --------------------------------------------------------------------------- .text:0000000000012D91 push rcx .text:0000000000012D92 push rdx .text:0000000000012D93 push rbx .text:0000000000012D94 push rbp .text:0000000000012D95 push rsi .text:0000000000012D96 push rdi .text:0000000000012D97 nop .text:0000000000012D98 nop .text:0000000000012D99 push r9 .text:0000000000012D9B push r10 .text:0000000000012D9D push r11 .text:0000000000012D9F push r12 .text:0000000000012DA1 push r13 .text:0000000000012DA3 push r14 .text:0000000000012DA5 push r15 .text:0000000000012DA7 nop .text:0000000000012DA8 nop .text:0000000000012DA9 nop .text:0000000000012DAA nop .text:0000000000012DAB nop .text:0000000000012DAC nop .text:0000000000012DAD .text:0000000000012DAD loc_12DAD: ; CODE XREF: .text:0000000000012DCBj .text:0000000000012DAD mov rsi, 0 .text:0000000000012DB4 mov rax, [rsi+rcx] .text:0000000000012DB8 xor rax, 7 .text:0000000000012DBC mov [rsi+rcx], rax .text:0000000000012DC0 nop .text:0000000000012DC1 nop .text:0000000000012DC2 nop .text:0000000000012DC3 nop .text:0000000000012DC4 inc rsi .text:0000000000012DC7 cmp rsi, 0Bh .text:0000000000012DCB jz short loc_12DAD .text:0000000000012DCD nop .text:0000000000012DCE add rsp, 28h .text:0000000000012DD2 pop r15 .text:0000000000012DD4 pop r14 .text:0000000000012DD6 pop r13 .text:0000000000012DD8 pop r12 .text:0000000000012DDA pop r11 .text:0000000000012DDC pop r10 .text:0000000000012DDE pop r9 .text:0000000000012DE0 pop r8 .text:0000000000012DE2 pop rdi .text:0000000000012DE3 pop rsi .text:0000000000012DE4 pop rbp .text:0000000000012DE5 pop rbx .text:0000000000012DE6 pop rdx .text:0000000000012DE7 nop .text:0000000000012DE8 pop rax .text:0000000000012DE9 nop .text:0000000000012DEA add ah, cl |
根据堆栈平衡以及出栈入栈完善后的shellcode:
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 |
.text:0000000000012D90 shellcode proc near ; DATA XREF: sub_12250+25o .text:0000000000012D90 push rax .text:0000000000012D91 push rcx .text:0000000000012D92 push rdx .text:0000000000012D93 push rbx .text:0000000000012D94 push rbp .text:0000000000012D95 push rsi .text:0000000000012D96 push rdi .text:0000000000012D97 push r8 .text:0000000000012D99 push r9 .text:0000000000012D9B push r10 .text:0000000000012D9D push r11 .text:0000000000012D9F push r12 .text:0000000000012DA1 push r13 .text:0000000000012DA3 push r14 .text:0000000000012DA5 push r15 .text:0000000000012DA7 nop .text:0000000000012DA8 nop .text:0000000000012DA9 sub rsp, 28h .text:0000000000012DAD .text:0000000000012DAD loc_12DAD: ; CODE XREF: shellcode+3Bj .text:0000000000012DAD mov rsi, 0 .text:0000000000012DB4 mov rax, [rsi+rcx] .text:0000000000012DB8 xor rax, 7 .text:0000000000012DBC mov [rsi+rcx], rax .text:0000000000012DC0 nop .text:0000000000012DC1 nop .text:0000000000012DC2 nop .text:0000000000012DC3 nop .text:0000000000012DC4 inc rsi .text:0000000000012DC7 cmp rsi, 0Bh .text:0000000000012DCB jz short loc_12DAD .text:0000000000012DCD nop .text:0000000000012DCE add rsp, 28h .text:0000000000012DD2 pop r15 .text:0000000000012DD4 pop r14 .text:0000000000012DD6 pop r13 .text:0000000000012DD8 pop r12 .text:0000000000012DDA pop r11 .text:0000000000012DDC pop r10 .text:0000000000012DDE pop r9 .text:0000000000012DE0 pop r8 .text:0000000000012DE2 pop rdi .text:0000000000012DE3 pop rsi .text:0000000000012DE4 pop rbp .text:0000000000012DE5 pop rbx .text:0000000000012DE6 pop rdx .text:0000000000012DE7 pop rcx .text:0000000000012DE8 pop rax .text:0000000000012DE9 retn .text:0000000000012DE9 shellcode endp |
十三、Reversemeplz
该题主要涉及到一个字符的转换。
解密过程如下:
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 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
#include <stdio.h> #include <stdlib.h> #include <string.h> unsigned char f0(char a1) { char v1; // al@1 signed int v2; // edi@1 int v3; // ebx@3 signed int v4; // edi@3 int v5; // ebx@5 signed int v6; // edi@5 int v7; // ebx@7 signed int v8; // edi@7 char v9; // cl@9 int v10; // edx@9 signed int v11; // edi@9 int v12; // edx@9 int v13; // edx@11 signed int v14; // edi@11 signed int v15; // ecx@11 int v16; // edx@13 signed int v17; // ecx@13 int v18; // edx@15 signed int v19; // ecx@15 int v20; // edx@17 signed int v21; // ebx@17 int v22; // edx@19 signed int v23; // ebx@19 int v24; // edx@21 signed int v25; // ebx@21 int v26; // edx@23 signed int v27; // ebx@23 int v28; // edx@25 signed int v29; // ecx@25 int v30; // edx@27 signed int v31; // ecx@27 int v32; // edx@29 signed int v33; // ecx@29 signed int v34; // esi@31 int v35; // edx@31 char v36; // cl@31 int v37; // edx@33 signed int v38; // esi@33 int v39; // edx@35 int v40; // edx@37 signed int v41; // edi@37 int v42; // edx@39 signed int v43; // edi@39 int v44; // edx@41 signed int v45; // ecx@41 signed int v46; // esi@43 int v47; // edx@43 int v48; // esi@45 bool v49; // zf@45 signed int v50; // eax@45 char v52; // [sp+4h] [bp-10h]@9 v1 = a1; v2 = 19; if ( (v1 & '?') != 38 ) v2 = 0; v3 = v2 | ((unsigned __int8)v1 << 8) | 9 * ((v1 & 0x5F) == 86); v4 = 71; if ( (v1 & 'w') != 116 ) v4 = 0; v5 = v4 | v3; v6 = 84; if ( (v1 & '?') != 39 ) v6 = 0; v7 = v6 | v5; v8 = 48; if ( (v1 & 'O') != 4 ) v8 = 0; v9 = v1 & 0x1F; v10 = 3 * ((v1 & 'W') == 80) | 8 * (v9 == 1) | v7 | v8 | 2 * (v9 == 15) | 2 * ((v1 & 0x5B) == 83); v11 = 114; v52 = ~v1; v12 = 8 * (v9 == 2) | 8 * (v9 == 11) | v10 | 2 * ((v1 & 'W') == 66) | 8 * ((v1 & 0x2E) == 44); if ( (v1 & 0x37) != 37 ) v11 = 0; v13 = v11 | v12; v14 = 16; v15 = 0; if ( (v1 & 0x1C) == 8 ) v15 = 16; v16 = ((~v1 & 0x78u) < 1 ? 0x48 : 0) | v15 | v13; v17 = 64; if ( (v1 & 0x1D) != 16 ) v17 = 0; v18 = v17 | v16; v19 = 0; if ( (v1 & 0xF) == 11 ) v19 = 16; v20 = 4 * ((v1 & 0x55) == 64) | v19 | v18; v21 = 72; if ( (v1 & 0x4B) != 1 ) v21 = 0; v22 = v21 | v20; v23 = 24; if ( (v1 & 0x47) != 1 ) v23 = 0; v24 = v23 | v22; v25 = 96; if ( (v1 & 0x2B) != 34 ) v25 = 0; v26 = ((v52 & 0x55u) < 1 ? 0x48 : 0) | v25 | v24; v27 = 0; if ( (v1 & 0x31) == 16 ) v27 = 16; v28 = v27 | v26; v29 = 0; if ( (v1 & 0x55) == 81 ) v29 = 68; v30 = v29 | v28; v31 = 0; if ( (v1 & 0xE) == 8 ) v31 = 32; v32 = v31 | v30; v33 = 97; if ( (v1 & 0x59) != 72 ) v33 = 0; v34 = 81; v35 = v33 | v32; v36 = v1 & 0x17; if ( (v1 & 0x17) != 4 ) v34 = 0; v37 = v34 | v35; v38 = 37; if ( (v1 & 0x47) != 66 ) v38 = 0; v39 = v37 | v38 | 8 * ((v1 & 0x43) == 2); if ( (v1 & 0x46) != 2 ) v14 = 0; v40 = v14 | v39; v41 = 80; if ( v36 != 3 ) v41 = 0; v42 = v41 | v40; v43 = 70; if ( v36 != 1 ) v43 = 0; v44 = v43 | v42; v45 = 40; if ( (v1 & 0x70) != 64 ) v45 = 0; v46 = 0; v47 = 4 * ((v1 & 0x41) == 1) | ((v52 & 0xBu) < 1 ? 0x60 : 0) | v45 | v44; if ( (v1 & 0x48) == 64 ) v46 = 32; v48 = v47 | v46; v49 = (v1 & 0x21) == 1; v50 = 0; if ( v49 ) v50 = 68; return v48 | v50; } char p[256]; char out[16]; int x[]={-1, 0x11, -0x0B, 0x3, -0x8, 0x5, 0x0E, -0x3, 0x1, 0x6, -0x0B, 0x6, -0x8, -0x0A}; void main() { for(int i=0;i<=0xFF;i++) { p[i]=f0(i); printf("%02X %02X\n",i,p[i]); } out[0]=0x62; for( i=1;i<15;i++) { out[i]=out[i-1]+x[i-1]; } for(i=0;i<15;i++) { out[i]=p[out[i]]; } printf("%s\n",out); } |
十四、John the packer
该题将几个重要的函数加密了,并在运行过程中才解密。
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 |
.text:080485E0 .text:080485E0 sub_80485E0 proc near ; CODE XREF: .text:08048C14p .text:080485E0 .text:080485E0 arg_0 = dword ptr 8 .text:080485E0 arg_4 = dword ptr 0Ch .text:080485E0 .text:080485E0 push ebp .text:080485E1 mov ebp, esp .text:080485E3 sub esp, 8 .text:080485E6 mov eax, [ebp+arg_0] .text:080485E9 and eax, 0FFFFF000h .text:080485EE sub esp, 4 .text:080485F1 push 7 ; prot .text:080485F3 push 1000h ; len .text:080485F8 push eax ; addr .text:080485F9 call _mprotect ; 使函数部分内存可写 .text:080485FE add esp, 10h .text:08048601 mov ecx, [ebp+arg_0] .text:08048604 mov edx, 66666667h .text:08048609 mov eax, ecx .text:0804860B imul edx .text:0804860D sar edx, 1 .text:0804860F mov eax, ecx .text:08048611 sar eax, 1Fh .text:08048614 sub edx, eax .text:08048616 mov eax, edx .text:08048618 mov edx, eax .text:0804861A shl edx, 2 .text:0804861D add edx, eax .text:0804861F mov eax, ecx .text:08048621 sub eax, edx .text:08048623 mov edx, off_804A294[eax*4] .text:0804862A mov eax, [ebp+arg_0] .text:0804862D mov ecx, [ebp+arg_4] .text:08048630 add esp, 8 .text:08048633 push eax .text:08048634 mov edx, [edx] .text:08048636 .text:08048636 loc_8048636: ; CODE XREF: sub_80485E0+5Cj .text:08048636 xor [eax], edx ; 函数解密 .text:08048638 add eax, 4 .text:0804863B dec ecx .text:0804863C jnz short loc_8048636 ; 函数解密 .text:0804863E pop eax .text:0804863F call eax ; 运行函数 .text:08048641 sub esp, 8 .text:08048644 push [ebp+arg_4] .text:08048647 push [ebp+arg_0] .text:0804864A call sub_804859B .text:0804864F add esp, 10h .text:08048652 nop .text:08048653 leave .text:08048654 retn |
解密的过程不复杂,可以静态解密也可以动态调试来获取真实函数。下面是获取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 |
from math import * import struct f_h="flag{" f_e="}" f_6_11="" for i in range(1,7): v0=pow(i,5.0)*0.5166666688 v1=v0-pow(i,4.0)*8.125000037 v2=pow(i,3.0)*45.83333358+v1 v3=v2-pow(i,2.0)*109.8750007+i*99.65000093+83.99999968 f_6_11+=chr(int(floor(v3))) print len(f_6_11),f_6_11 T0= "\x15\x00\x00\x00\x00\x80\x00\x00\x15\x00\x00\x00\x00\x00\x08\x00" T0+="\x15\x00\x00\x00\x00\x00\x80\x00\x15\x00\x00\x00\x00\x80\x00\x00" T0+="\x15\x00\x00\x00\x00\x00\x40\x00\x15\x00\x00\x00\x00\x80\x00\x00" T0+="\x15\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x40\x00" T0+="\x15\x00\x00\x00\x00\x00\x08\x00\x15\x00\x00\x00\x00\x00\x00\x80" T0+="\x15\x00\x00\x00\x00\x80\x00\x00" T1=struct.unpack("11Q",T0) print T1 f_12_23="" for t in T1: #print hex(t) t0=long((fabs(t)-21)/4) print t0 if t0<2 and t0>=0: t0=t0#+0x8000000000000000 c=log(t0+long(9.223372036854776e18))/log(2) else: c=log((t-21)/4)/log(2) print c f_12_23+=chr(int(c)) print len(f_12_23),f_12_23 flag=f_h+f_6_11+f_12_23 T2="\x44\x07\x43\x59\x1C\x5B\x1E\x19\x47\x00" for c in T2: flag+=chr(ord(flag[len(flag)-1])^ord(c)) flag+=f_e print "\n",flag |
十五、Keylead
获取到的文件压缩了,解压后得到一个linux x64执行文件。静态分析后得知此题是5玩骰子,练习5次掷对后就能获取flag,可惜最后一个要掷出7,那是不可能的,不过稍微修改下程序flag就能出来了。
十六、Bin100(ebCTF 2013)
这题同样是掷骰子,和前一题类似,修改下程序flag就能出来了。
十七、NSCTF Reverse 400 & 500
NSCTF的writeup我在前一篇文章写过了,这里就不重复写了。
related: