一.findit
1.得到apk文件,使用jeb打开,tab反编译,在MainActivitySource中发现关键词
2.在后面发现一串跟flag很像的字串
3.简单看一下后面的代码,发现是将后面的字串进行某种加密解密处理,把字串弄下来
点击查看代码
str = ['p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}']
for i in str:
print(i,end='')
pvkq{m164675262033l4m49lnp7p9mnk28k75}
4.凯撒解密得到flag
flag{c164675262033b4c49bdf7f9cda28a75}
二.rsa
1.得到一个key文件和一个enc文件,key文件010打开,发现是公钥
4.得到p、q,使用脚本得到d
81176168860169991027846870170527607562179635470395365333547868786951080991441
点击查看代码
import gmpy2
p =gmpy2.mpz(285960468890451637935629440372639283459)
q =gmpy2.mpz(304008741604601924494328155975272418463)
e =gmpy2.mpz(65537)
phi_n= (p - 1) * (q - 1)
d = gmpy2.invert(e, phi_n)
print("d is:")
print (d)
5.已知pqend,使用脚本解密flag.enc文件,得到flag
点击查看代码
import rsa
e = 65537
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
d = 81176168860169991027846870170527607562179635470395365333547868786951080991441
key = rsa.PrivateKey(n,e,d,q,p)
with open("./flag.enc","rb") as f:
f = f.read()
print(rsa.decrypt(f,key))
三、[ACTF新生赛2020]rome
1.查壳,无壳,IDA(非64)打开
2.shiftF12查找字符,找到关键字符
3.点进函数,审计一下函数,发现flag的头ACTF{}
4.可以发现主要的加密函数就是两个while函数
5.简单处理一下伪代码
点击查看代码
while (v12[17] <= 15 )
{
if (v1 + v12[17]) > 64 && v1 + v12[17]) <= 90 )
(v1 + v12[17]) = (v1 + v12[17]) - 51) % 26 + 65;
if (v1 + v12[17]) > 96 && v1 + v12[17]) <= 122 )
(v1 + v12[17]) = (v1 + v12[17]) - 79) % 26 + 97;
++v12[17];
}
v12[17] = 0;
while (v12[17] <= 15 )
{
result = v12[v12[17]];
if (v1 + v12[17]) != result )
return result;
++v12[17];
}
6.直接按照伪代码的加密方式写个脚本
点击查看代码
v12 = "Qsw3sj_lz4_Ujw@l"
v12 = list(v12)
flag = ''
for i in range(16):
for j in range(128):
x = j
if chr(x).isupper():
x = (x-51)%26+65
if chr(x).islower():
x = (x-79)%26+97
if chr(x) == v12[i]:
flag += chr(j)
print(flag)
7.得到的就是flag
flag{Cae3ar_th4_Gre@t}
四、[FlareOn4]login
1.得到一个html一个txt,用VS打开html,发现这个的原理就是一个if判断rotFlag,改一下代码,在if前面加一句alert(rotFlag)回显flag
2.进入网页,在框内输入源码中的字串
PyvragFvqrYbtvafNerRnfl@syner-ba.pbz
3.得到的回显中的内容就是flag
flag{ClientSideLoginsAreEasy@flare-on.com}
五、[GUET-CTF2019]re
1.查壳,有壳,UPXShell脱壳
3.发现主要是经过了一个重要的函数sub_4009AE(),点进去审计一下代码
4.全都是简单的if判断,通过观察可以发现a16和a17换位置了,同时没有a6,写个脚本逆回去可以得到的字符
点击查看代码
s1 = [1629056,6771600,3682944,10431000,3977328,5138336,7532250,5551632,3409728,13013670,6088797,7884663,8944053,5198490,4544518,10115280,3645600,9667504,5364450,13464540,5488432,14479500,6451830,6252576,7763364,7327320,8741520,8871876,4086720,9374400,5759124]
s2 = [166163712,731332800,357245568,1074393000,489211344,518971936,406741500,294236496,177305856,650683500,298351053,386348487,438258597,249527520,445362764,981182160,174988800,493042704,257493600,767478780,312840624,1404511500,316139670,619005024,372641472,373693320,498266640,452465676,208422720,515592000,719890500]
for i in range(len(s1)):
print(chr(s2[i] // s1[i]),end='')
5.剩下的a6可以使用BP爆破或者猜测,最终a6是1,得到flag
flag{e165421110ba03099a1c039337}
六、[WUSTCTF2020]level1
1.查壳,无壳,IDA(64)打开,找到main函数
2.代码很简单,就是打开一个名为flag的文件,读入其中数据到ptr数组中,然后使用for循环进行对应的处理然后直接输出,名为flag的文件就是output.txt,写个脚本
点击查看代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
int ls[20] = {0,198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000};
for (int i = 1; i <= 19; ++i)
{
if (i & 1)
printf("%c", (unsigned int)(ls[i] >> i));
else
printf("%c", (unsigned int)(ls[i] / i ));
}
}
3.得到flag
七、[WUSTCTF2020]level2
2.使用IDA(非64)打开,搜索字串
3.发现flag
wctf2020{Just_upx_-d}
八、[MRCTF2020]hello_world_go
1.查壳,无壳,IDA(64)打开
2.查找字串,得到flag
flag{hello_world_gogogo}
九、[WUSTCTF2020]level3
1.查壳,无壳,IDA(64)打开
2.找关键字串,发现是和base64有关,进入函数
3.发现关键字串,一串base64加密后的字串,但是直接使用网站解密出来的是一串乱码,猜测是有变表
4.找一下字母表,进入base64_encode()函数,没啥发现,看一下旁边的函数列表,发现一个名字很奇特的函数
5.点进去,发现是将base64_table进行了运算,而base64_table就是加密的字母表,那就写个脚本运行一下得到加密用到的真正的字母表
点击查看代码
base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
base64_table = list(base64_table)
for i in range(10):
v1 = base64_table[i]
base64_table[i] = base64_table[19 - i]
result = 19 - i
base64_table[result] = v1
for i in base64_table:
print(i,end='')
6.得到正确的字母表
TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
7.使用这个字母表进行解密,脚本如下:
点击查看代码
import base64
import string
str1 = "d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD=="
string1 = "TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))
8.得到flag
wctf2020{Base64_is_the_start_of_reverse}
十、[FlareOn4]IgniteMe
1.查壳,无壳,IDA(非64)打开
2.查找关键字串,发现关键字串,进入函数
3.可以发现主要的就是sub_4010F0()函数,点进去
4.可以看出是将byte_403180[]数组进行了加密,数组追踪就可以得到
5.写个脚本模拟一下过程,v4使用动调可以得到为4,贴了一个大佬的脚本
点击查看代码
byte_403000=[0x0D,0x26,0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C, 0x5D,0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44, 0x6F, 0x6E, 0x56, 0x9,0x5F, 0x45, 0x47, 0x73, 0x26, 0x0A, 0x0D, 0x13, 0x17, 0x48, 0x42,0x1, 0x40, 0x4D, 0x0C, 0x2, 0x69, 0x0]
flag=""
L=len(byte_403000)-1
for i in range(len(byte_403000)):
if i==0:
byte_403000[L-i]= byte_403000[L-i]^0x4
byte_403000[L-i-1] = byte_403000[L-i-1]^byte_403000[L-i]
flag+=chr(byte_403000[L-i])
print(byte_403000)
print(flag[::-1])
6.得到flag
flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}
十一、特殊的 BASE64
1.查壳,无壳,IDA(64)打开,搜索关键字串
2.发现一串字母表和一个很像base64加密的字串,猜测是base64变表,使用脚本解密
点击查看代码
import base64
import string
str1 = "mTyqm7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI=="
string1 = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0987654321/+"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))
3.得到flag
flag{Special_Base64_By_Lich}
1.查壳,无壳,IDA(64)打开
2.查字串,进入有关键字串的函数,发现了两个字符串数组
3.主要的加密关键就是一个for循环,循环33次,进行异或运算,flag的位数为33,写一个脚本逆一下
点击查看代码
flag = [0 for x in range (0,34)]
ls3 = []
ls1 = [0x9, 0x0A, 0x0F, 0x17, 0x7, 0x18, 0x0C, 0x6, 0x1, 0x10, 0x3, 0x11, 0x20,0x1D, 0x0B, 0x1E, 0x1B, 0x16, 0x4, 0x0D, 0x13, 0x14, 0x15, 0x2, 0x19,0x5, 0x1F, 0x8, 0x12, 0x1A, 0x1C, 0x0E, 0]
ls2 = [0x67,0x79,0x7B,0x7F,0x75,0x2B,0x3C,0x52,0x53,0x79,0x57,0x5E,0x5D,0x42,0x7B,0x2D,0x2A,0x66,0x42,0x7E,0x4C,0x57,0x79,0x41,0x6B,0x7E,0x65,0x3C,0x5C,0x45,0x6F,0x62,0x4D,0]
for i in range(33):
ls3.append(ls2[i] ^ ls1[i])
flag[ls1[i]] = ls3[i]
for i in flag:
print(chr(i),end='')
4.得到flag
MRCTF{Tr4nsp0sltiON_Clph3r_1s_3z}
十三、Youngter-drive
1.查壳,UPX,kali脱壳
2.IDA(非64)打开,shiftF12查找关键字串,进入函数
3.主要有用的函数是__cdecl sub_411940(),用到的两个字串数组追踪可得到
4.贴一个大佬的脚本
点击查看代码
off_418000 = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
off_418004 = "TOiZiZtOrYaToUwPnToBsOaOapsyS"
flag=''
for i in range(len(off_418004)):
if i %2 == 0:
flag += off_418004[i]
continue
for j,k in enumerate(off_418000):
if off_418004[i] == k:
if chr(j+38).isupper():
flag += chr(j+38)
else:
flag += chr(j+96)
print(flag)
flag{ThisisthreadofwindowshahaIsESE}