逆向刷题记录
该随笔为本人在刷题过程中遇到的不同类型的逆向题型,本人学艺不精,如有错误,还请谅解和指正。
1. HNCTF checker
题目链接:https://www.nssctf.cn/problem/3106
下载题目附件,得到俩张图片和一个网址,打开网址后F12查看源代码,发现一串java脚本:
atob函数是对数据进行base64解密操作,因此密码即为“goldenticket”的base64加密,用户名为Admin,登录即可得flag
2.NSSCTFrOUND#2 findXenny
题目链接:https://www.nssctf.cn/problem/2225
本题考查SMC技术,即在静态分析过程中代码会加密,而当程序运行时代码会自动解密。因此在关键判断处下断点:
接着动态调试,注意前面有字数限制,随意输入一串长度为16的字符串,动态调试找到上面的三个判断名。进入其所指地址,按C键转化为代码,再按P键声明为函数,F5查看伪代码即可得到三部分flag
注意ida的大端排序,将字符串反向拼接即可得到flag{oh_you_find_our_x3nny}
3.HNCTF Easy_Android
该题为安卓逆向,下载附件后直接放进jadx,找到MainActivity,观察有flag标志:
发现是对username进行MD5加密,根据循环推测flag是加密后字符串的奇数位:
同时在前面找到username:
写出脚本得到flag:
4.ACTF 凯撒
查壳后发现是32位,用ida打开,非常简单的程序:
很明显的凯撒密码,输入一串flag,经过某一个小于16的位移后如果和byte_403008相同,那么就输出成功。知道了算法,我们直接爆破,代码如下:
点击查看代码
include<stdio.h>
include<string.h>
int main()
{
char flag[] = {
0x6C, 0x71, 0x6E, 0x7F, 0x71, 0x86, 0x6E, 0x3C, 0x3F, 0x7E, 0x7E, 0x74, 0x6E, 0x6A, 0x6E, 0x6C,
0x70, 0x40, 0x6C, 0x7D, 0x88 };
for ( int i = 0 ; i <= 16 ; i++ ){
for ( int j = 0 ; j < strlen(flag) ; j++ ){
printf("%c",flag[j] - i);
}
printf("\n");
}
return 0;
}
5.FSCTF signin
查壳发现有upx壳,upx -d脱壳:
进去找到一个假flag,交了一下不对:FSCTF{1t_15_re4lly_0bv10u5_t0_f1nd}
阅读一下源代码,发现几个地方需要进行替换,其实就是将数字改成对应的字母
FSCTF{it_is_really_obvious_to_find}
6.HGAME A_cup_of_tea
用ida64位打开附件,正如其名,是典型的tea加密,经过分析发现Buf1以及v10都为flag,Buf2为加密后的flag,而这个:
显然就是加密的key,点进内存后发现一串数:
推测为我们要找的key,因为key有四位,因此猜测每8位为一个key,这里注意将ida的大端排序转化为小端排序,得到key。接着写脚本进行运行。在解密时应注意,最后得到的大数字应该将其转换为占4个字节的char类型,因此将大数字的每四位作为字符输出,否则将不能解得flag,代码如下:
点击查看代码
#includeint main()
{
unsigned long Buf2[8];
Buf2[0] = 778273437;
Buf2[1] = -1051836401;
Buf2[2] = -1690714183;
Buf2[3] = 1512016660;
Buf2[4] = 1636330974;
Buf2[5] = 1701168847;
Buf2[6] = -1626976412;
Buf2[7] = 594166774;
unsigned int key[4] = {0x12345678, 0x23456789, 0x34567890, 0x45678901};
for ( int i = 0 ; i < 8 ; i += 2 ){
long long sum = 32 * 0xABCDEF23;
for ( int j = 0 ; j < 32 ; j ++ ){
Buf2[i+1] -= (Buf2[i] + sum ) ^ (key[2] + 16 * Buf2[i]) ^ (key[3] + (Buf2[i] >> 5));
Buf2[i] -= (sum + Buf2[i+1]) ^ (key[0] + 16 * Buf2[i+1]) ^ (key[1] + (Buf2[i+1] >> 5));
sum -= 0xABCDEF23;
}
}
char *p = (char *)Buf2;
for ( int i = 0 ; i <= 4 * 8 ; i++ )
printf("%c",*(p + i) );
return 0;
}
解出flag,最后少了个k,根据句意补全即可: