Buuctf
1、lucky_guy
1 | unsigned __int64 get_flag() |
这是主函数,switch中有5个case,case1中f1有半截字符串,我们要得到f2,拼起来才是我们要的flag,那么要f2肯定得从case4出发,到case5,才能得到f2,所以我们很清楚了,注意s是小端序
1 | s=[0x69,0x63,0x75,0x67,0x60,0x6F,0x66,0x7F] |
2、刮开有奖
1 | INT_PTR __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4) |
很简单,string长8位,从if中判断前两位分别是,U,J,然后,后六位是两个base64解密移位就出来了。
下面是base64反编译,没有换标
1 | _BYTE *__cdecl sub_171000(int a1, int a2) |
3、findit
有一说一这个题不太好猜。
猜测第一个数组是就是flag,其实不是,第二个才是,但搞出来后发现是:
pvkq{m164675262033l4m49lnp7p9mnk28k75}
flag{c164675262033b4c49bdf7f9cda28a75}
然后又猜测是凯撒密码,有点难猜
4、pyre
1 | #!/usr/bin/env python |
这是一个pyc文件,所以在线反编译,逆向就行了
1 | code = [ |
5 easyre
非常简单,就是一个在数组里寻数的问题,可以用类似爆破的脚本完成。
1 | v4 = [42,70,39,34,78,44,34,40,73,63,43,64] |
6 rsa
这个rsa难的地方在于,给了两个包,不好打开,注册表打开,可以将其后缀变成txt,或者直接在
http://tool.chacuo.net/cryptrsakeyparse进行n ,e的提取,还给了个enc文件,无法提取,因为这个c是乱码,所以,直接用文件提取来搞
1 | import gmpy2 |
7、rome
1 | int func() |
这个题就是flag经过变换,要和上面字符串一样,那么最好的办法就是爆破
1 | x = [81,115,119,51,115,106,95,108,122,52,95,85,106,119,64,108] |
8 level1
这个题很显然直接逆向或者爆破都可以
读入文件而已,要注意读入的字符串长度是20,而不是文件里给的19,所以要加上个0
1 | a=[0,198, |
tf2020{d9-dE6-20c,括号中就是。
9、TRANSFORM
我们要求的flag分别进行了移位和异或操作,有点简单。
1 | a = [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,0x3F] |
10、urual加密
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
然后我试图直接解密,发现不对,这里面还有一个函数
是进行将大小写互换的:secret = ‘zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9’.swapcase()
这样进行大小写互换
然后解密就行了
11、maze
这个题先upx搞一下,然后就是走迷宫,
1 | *******+** |
很明显是从+到F,w表示上,a表示左,s表示下,d表示右。结束!
12、相册
这个安卓题还是很难的,有我三面的味了,很real
从字符串中查找,发现应该跟base64有关,我们找一下对应so文件用ida打开
NativeMethod在java里面通常用于调用外部非java的程序。Java有能力调用其他语言编写的函数or方法,这个通过JNI(Java Native Interfface)实现。使用时,通过native关键字告诉JVM这个方法是在外部定义的。
解出来就对了