RE
re1
64位程序,IDA查看。
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
v4数组是flag的值,让bytes_0318912x[m] == v4[m]时候跳转到Congratulations处,encrypt_ jump()对v4没有影响,直接逆算法。注意在这里:
1 | for ( k = 0; k <= 27; ++k ) |
按理说模运算并不容易复原,但尝试后发现这里只有倍数k=1。
1 | bytes_0318912x = [0x4D5E21,0x4D5E2B,0x4D5E3E,0x4D5E20, |
re2
64位程序,IDA查看伪代码。
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
当输入字符串v4满足Auth(v4, argv) == 1时,打印出”Congratulations!~”,v4为flag值。进入Auth函数,a1=v4。
1 | signed __int64 __fastcall Auth(__int64 a1) |
发现最终要使Auth()返回 1,那么就要满足bytes_0x0001[j] = v7[j],bytes_0x0002[j]=v6[j],bytes_0x0003[j]=v5[j]。bytes_0x0001,bytes_0x0002,bytes_0x0003可以直接查看,那么需要知道v5,v6,v7的值。v5,v6,v7由v2,v3,v4经过S盒得出。如果推出v2,v3,v4的值,根据前面的循环,可以拼凑出a1的值。3个S盒:
1 | _DWORD *__fastcall SboxExchangeA(__int64 a1, __int64 a2) |
1 | _DWORD *__fastcall SboxExchangeB(__int64 a1, __int64 a2) |
1 | _DWORD *__fastcall SboxExchangeC(__int64 a1, __int64 a2) |
发现3个S盒只是简单的异或运算,直接异或回去就好。
1 | bytes_0x0001 = [0x0C8E, 0x0C85, 0x0C87, 0x0C99, 0x0CA4, 0x0CD1, 0x0C83, 0x0C8E, 0x0C84] |
re3
apk文件解压之后dex2jar转为jar文件,jd-gui打开。可以看到有两个Activity:MainActivity.class和FlagActivity.class
1 | // MainActivity.class |
Globalhit = 999999,用listener来监听点击事件,每点击一次Globalhit减1,当Globalhit = 0时利用Intent传参调用startActivity()来启动FlagActivity。
1 | // FlagActivity.class |
最后打印出的是encF中的字符。
1 | encF = [4, 5, 30, 27, 9, 55, 56, 53, 43, 15, 70, 90, 85, 14, 25, 9, 78, 54, 83, 96, 25, 23, 19, 115, 25, 49, 77, 75, 29, 28, 4, 122, 96, 110, 56, 16 ] |
Crypto
Crypto_xor
hint: [‘\x00’,’\x00’,’\x00’] at start of xored is the best hint you get.
1 | xored = ['\x00', '\x00', '\x00', '\x18', 'C', '_', '\x05', 'E', 'V', 'T', 'F', 'U', 'R', 'B', '_', 'U', 'G', '_', 'V', '\x17', 'V', 'S', '@', '\x03', '[', 'C', '\x02', '\x07', 'C', 'Q', 'S', 'M', '\x02', 'P', 'M', '_', 'S', '\x12', 'V', '\x07', 'B', 'V', 'Q', '\x15', 'S', 'T', '\x11', '_', '\x05', 'A', 'P', '\x02', '\x17', 'R', 'Q', 'L', '\x04', 'P', 'E', 'W', 'P', 'L', '\x04', '\x07', '\x15', 'T', 'V', 'L', '\x1b'] |
提示说3个\x00是关键提示,我寻思不就是相同异或为0吗…虽然s1s2是可打印字符串,但只知道异或的值构造flag好像又有点说不过去。flag开头固定字符长度为3的只有’ctf’,len(xored) = 69是3的倍数,只好猜想s1或s2中是’ctf’重复23次。(总之有点迷)
1 | s1 = ['c', 't', 'f'] * 23 |
Crypto_easy_crypto
变过形的RSA。题目代码:
1 | from Crypto.Util.number import * |
加密过程$\mathsf{\scriptsize m^{e}\equiv c(mod\;pqr(p+q+r))}$因为$\mathsf{\scriptsize p,q,r,p+q+r}$两两互质,因此等价于4个同余式:
注意到$\mathsf{\scriptsize m^{e}\equiv c(mod\;p+q+r)}$中$\mathsf{\scriptsize p+q+r}$已知,由于$\mathsf{\scriptsize p+q+r}$为素数,则有$\mathsf{\scriptsize (e,p+q+r)=1}$,因此存在$\mathsf{\scriptsize d}$使得$\mathsf{\scriptsize ed\equiv 1(mod\;p+q+r-1)}$。计算$\mathsf{\scriptsize d}$用来解密:$\mathsf{\scriptsize m\equiv c^{d}(mod\;p+q+r)}$
1 | import gmpy2 |