Pixiv - KiraraShss
1254 字
6 分钟
buuctf之路
个人的刷题之旅,尽量的写的清晰明了一些,也是一种对知识回顾和学习的方法。
#1.假如给我三天光明




#2.[SWPU2019]神奇的二维码
附件给了一个二维码,用qr扫一下








#3.Java逆向解密
题目给了一个class文件,是java编译后的,我们用jadx反编译一下 即打开jadx,然后打开一下题目给的class文件。
package defpackage;
import java.util.ArrayList;import java.util.Scanner;
/* loaded from: Reverse.class */public class Reverse { public static void main(String[] args) { Scanner s = new Scanner(System.in); System.out.println("Please input the flag :"); String str = s.next(); System.out.println("Your input is :"); System.out.println(str); char[] stringArr = str.toCharArray(); Encrypt(stringArr); } public static void Encrypt(char[] arr) { ArrayList<Integer> Resultlist = new ArrayList<>(); for (char c : arr) { int result = (c + '@') ^ 32; Resultlist.add(Integer.valueOf(result)); } int[] KEY = {180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65}; ArrayList<Integer> KEYList = new ArrayList<>(); for (int i : KEY) { KEYList.add(Integer.valueOf(i)); } System.out.println("Result:"); if (Resultlist.equals(KEYList)) { System.out.println("Congratulations!"); } else { System.err.println("Error!"); } }}得到代码这样
分析一下
result = (c + ’@’) ^ 32
@的ascll码为64,输入的先加64 然后跟32异或
即 c = (result ^ 32) - 64
将180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65这些均操作一番,得到This_is_the_flag_!
所以flag为flag{This_is_the_flag_!}
---
3.[GXYCTF2019]luck_guy题目给了一个附件,"C:\Users\G1731\Downloads\attachment\luck_guy"先用pe看一下很正常,没壳,打开ida,扔进去
```int __fastcall main(int argc, const char **argv, const char **envp){ int v4; // [rsp+14h] [rbp-Ch] BYREF unsigned __int64 v5; // [rsp+18h] [rbp-8h]
v5 = __readfsqword(0x28u); welcome(); puts("_________________"); puts("try to patch me and find flag"); v4 = 0; puts("please input a lucky number"); __isoc99_scanf("%d", &v4); patch_me(v4); puts("OK,see you again"); return 0;}有个比较,patch_me,点点看
int __fastcall patch_me(int a1){ if ( a1 % 2 == 1 ) return puts("just finished"); else return get_flag();}```
又有一个get_flag,再点点看
```unsigned __int64 get_flag(){ unsigned int v0; // eax int i; // [rsp+4h] [rbp-3Ch] int j; // [rsp+8h] [rbp-38h] __int64 s; // [rsp+10h] [rbp-30h] BYREF char v5; // [rsp+18h] [rbp-28h] unsigned __int64 v6; // [rsp+38h] [rbp-8h]
v6 = __readfsqword(0x28u); v0 = time(0); srand(v0); for ( i = 0; i <= 4; ++i ) { switch ( rand() % 200 ) { case 1: puts("OK, it's flag:"); memset(&s, 0, 0x28u); strcat((char *)&s, f1); strcat((char *)&s, &f2); printf("%s", (const char *)&s); break; case 2: printf("Solar not like you"); break; case 3: printf("Solar want a girlfriend"); break; case 4: s = 0x7F666F6067756369LL; v5 = 0; strcat(&f2, (const char *)&s); break; case 5: for ( j = 0; j <= 7; ++j ) { if ( j % 2 == 1 ) *(&f2 + j) -= 2; else --*(&f2 + j); } break; default: puts("emmm,you can't find flag 23333"); break; } } return __readfsqword(0x28u) ^ v6;}```
三个代码只要看一个就好了,最后一个。rand() % 200 == 1,看到这个了吧,随机case,只有先4,后5,再1,才有flag,真是考验运气。所以我选择直接静态分析,case4的初值为0x7F666F6067756369LL,反编译这个要反着看,然后转化成字符,得到icugof\x7F```在通过case 5: for ( j = 0; j <= 7; ++j ) { if ( j % 2 == 1 ) *(&f2 + j) -= 2; else --*(&f2 + j); }奇数-2,偶数-1,对刚才的字符进行操作,得到hate_me},少一半,如果题目狠点心就只能动态分析了,但是它还是太善良了,我翻了翻ida,成功在

版权声明:本文由白白毛毛创作,转载请注明出处。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
最后更新于 2025-11-11,距今已过 58 天
部分内容可能已过时
Firefly