e@sy_flower
去除花指令
使用ida打开, F5没有用,直接向下滑,看到爆红的花指令
鼠标右击爆红的那一行, Patching -> Change byte
因为图片圈中的地方是+1,所以将第一个改为90(0x90 = NOP)即可
对着 main 函数 点击 p即可编译为函数,然后按 F5
代码分析:
// printf函数
sub_401020("please input flag\n", v8);
// scanf函数
sub_401050("%s", (char)Arglist);
v3 = strlen(Arglist);
// 奇数位和偶数位互换
for ( i = 0; i < v3 / 2; ++i )
{
v5 = Arglist[2 * i];
Arglist[2 * i] = Arglist[2 * i + 1];
Arglist[2 * i + 1] = v5;
}
// 将进行互换后的输入与 0x30异或
for ( j = 0; j < strlen(Arglist); ++j )
Arglist[j] ^= 0x30u;
// 进行处理后的输入要等于c~scvdzKCEoDEZ[^roDICUMC
v7 = strcmp(Arglist, "c~scvdzKCEoDEZ[^roDICUMC");
if ( v7 )
v7 = v7 < 0 ? -1 : 1;
if ( !v7 )
{
sub_401020("yes", v9);
exit(0);
}
sub_401020("error", v9);
解题脚本
enc = list('c~scvdzKCEoDEZ[^roDICUMC')
flag = []
# 与 0x30异或
for i in range(len(enc)):
flag.append(chr(ord(enc[i]) ^ 0x30))
#
for i in range(int(len(flag) / 2)):
tmp = flag[2 * i]
flag[2 * i] = flag[2 * i + 1]
flag[2 * i + 1] = tmp
for i in flag:
print(i, end='')
TTTTTTTTTea
代码分析
scanf("%s", v5);
v9 = v5;
// 将输入的值赋入 v4的后八位
for ( i = 0; i <= 5; ++i )
v4[i + 8] = *v9++;
// 两两进行XTea加密
for ( j = 0; j <= 2; ++j )
tea_encrypt(&v4[2 * j + 8], &key);
// 加密后的字符串要等于这些
v4[0] = 3240027994;
v4[1] = 2762803571;
v4[2] = 0xF61C9018;
v4[3] = 0x32E37BCD;
v4[4] = 0x2DCC1F26;
v4[5] = 0x344380CC;
for ( k = 0; k <= 5; ++k )
{
if ( v4[k] != v4[k + 8] )
{
printf("ERROR!");
exit(9);
}
}
解题脚本
#include<stdio.h>
int main()
{
unsigned int enc[6] = {0xC11EE75A, 0xA4AD0973, 0xF61C9018, 0x32E37BCD, 0x2DCC1F26, 0x344380CC};
unsigned int key[4] = {0x10203, 0x4050607, 0x8090A0B, 0x0C0D0E0F};
int i, j;
long sum = 0, delta = 0x61C88647;
// 解码
for(i=0;i < 6;i+=2){
sum = 0 - (32 * delta);
for(j = 0; j < 32; j++) {
enc[i+1] -= (((enc[i] >> 5) ^ (16 * enc[i])) + enc[i]) ^ (key[((sum >> 11) & 3)] + sum);
sum += delta;
enc[i] -= ((((enc[i+1] >> 5) ^ (16 * enc[i+1])) + enc[i+1]) ^ (key[sum & 3] + sum));
}
}
// 打印
for (i = 0; i < 6; i++)
{
for (j = 0; j<=3; j++)
{
printf("%c", (enc[i] >> (j * 8)) & 0xFF);
}
}
return 0;
}
来解个方程?
不太熟练
from sympy import Symbol
from sympy.solvers import solve
v2 = Symbol("v2")
v3 = Symbol("v3")
v4 = Symbol("v4")
v5 = Symbol("v5")
v6 = Symbol("v6")
v7 = Symbol("v7")
v8 = Symbol("v8")
v9 = Symbol("v9")
v10 = Symbol("v10")
v11 = Symbol("v11")
v12 = Symbol("v12")
v13 = Symbol("v13")
v14 = Symbol("v14")
v15 = Symbol("v15")
v16 = Symbol("v16")
v17 = Symbol("v17")
v18 = Symbol("v18")
v19 = Symbol("v19")
v20 = Symbol("v20")
v21 = Symbol("v21")
v22 = Symbol("v22")
v23 = Symbol("v23")
eq1 = 245 * v6 + 395 * v5 + 3541 * v4 + 2051 * v3 + 3201 * v2 + 1345 * v7 - 855009
eq2 = 3270 * v6 + 3759 * v5 + 3900 * v4 + 3963 * v3 + 1546 * v2 + 3082 * v7 - 1515490
eq3 = 526 * v6 + 2283 * v5 + 3349 * v4 + 2458 * v3 + 2012 * v2 + 268 * v7 - 854822
eq4 = 3208 * v6 + 2021 * v5 + 3146 * v4 + 1571 * v3 + 2569 * v2 + 1395 * v7 - 1094422
eq5 = 3136 * v6 + 3553 * v5 + 2997 * v4 + 1824 * v3 + 1575 * v2 + 1599 * v7 - 1136398
eq6 = 2300 * v6 + 1349 * v5 + 86 * v4 + 3672 * v3 + 2908 * v2 + 1681 * v7 - 939991
eq7 = 212 * v22 + 153 * v21 + 342 * v20 + 490 * v12 + 325 * v11 + 485 * v10 + 56 * v9 + 202 * v8 + 191 * v23 - 245940
eq8 = 348 * v22 + 185 * v21 + 134 * v20 + 153 * v12 + 460 * v9 + 207 * v8 + 22 * v10 + 24 * v11 + 22 * v23 - 146392
eq9 = 177 * v22 + 231 * v21 + 489 * v20 + 339 * v12 + 433 * v11 + 311 * v10 + 164 * v9 + 154 * v8 + 100 * v23 - 239438
eq10 = 68 * v20 + 466 * v12 + 470 * v11 + 22 * v10 + 270 * v9 + 360 * v8 + 337 * v21 + 257 * v22 + 82 * v23 - 233887
eq11 = 246 * v22 + 235 * v21 + 468 * v20 + 91 * v12 + 151 * v11 + 197 * v8 + 92 * v9 + 73 * v10 + 54 * v23 - 152663
eq12 = 241 * v22 + 377 * v21 + 131 * v20 + 243 * v12 + 233 * v11 + 55 * v10 + 376 * v9 + 242 * v8 + 343 * v23 - 228375
eq13 = 356 * v22 + 200 * v21 + 136 * v11 + 301 * v10 + 284 * v9 + 364 * v8 + 458 * v12 + 5 * v20 + 61 * v23 - 211183
eq14 = 154 * v22 + 55 * v21 + 406 * v20 + 107 * v12 + 80 * v10 + 66 * v8 + 71 * v9 + 17 * v11 + 71 * v23 - 96788
eq15 = 335 * v22 + 201 * v21 + 197 * v11 + 280 * v10 + 409 * v9 + 56 * v8 + 494 * v12 + 63 * v20 + 99 * v23 - 204625
eq16 = 428 * v18 + 1266 * v17 + 1326 * v16 + 1967 * v15 + 3001 * v14 + 81 * v13 + 2439 * v19 - 1109296
eq17 = 2585 * v18 + 4027 * v17 + 141 * v16 + 2539 * v15 + 3073 * v14 + 164 * v13 + 1556 * v19 - 1368547
eq18 = 2080 * v18 + 358 * v17 + 1317 * v16 + 1341 * v15 + 3681 * v14 + 2197 * v13 + 1205 * v19 - 1320274
eq19 = 840 * v18 + 1494 * v17 + 2353 * v16 + 235 * v15 + 3843 * v14 + 1496 * v13 + 1302 * v19 - 1206735
eq20 = 101 * v18 + 2025 * v17 + 2842 * v16 + 1559 * v15 + 2143 * v14 + 3008 * v13 + 981 * v19 - 1306983
eq21 = 1290 * v18 + 3822 * v17 + 1733 * v16 + 292 * v15 + 816 * v14 + 1017 * v13 + 3199 * v19 - 1160573
eq22 = 186 * v18 + 2712 * v17 + 2136 * v16 + 98 * v13 + 138 * v14 + 3584 * v15 + 1173 * v19 - 1005746
sol = solve((eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9, eq10, eq11, eq12, eq13, eq14, eq15, eq16, eq17, eq18, eq19,
eq20, eq21, eq22),
(v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23))
print(chr(sol[v2]), end='')
print(chr(sol[v3]), end='')
print(chr(sol[v4]), end='')
print(chr(sol[v5]), end='')
print(chr(sol[v6]), end='')
print(chr(sol[v7]), end='')
print(chr(sol[v8]), end='')
print(chr(sol[v9]), end='')
print(chr(sol[v10]), end='')
print(chr(sol[v11]), end='')
print(chr(sol[v12]), end='')
print(chr(sol[v13]), end='')
print(chr(sol[v14]), end='')
print(chr(sol[v15]), end='')
print(chr(sol[v16]), end='')
print(chr(sol[v17]), end='')
print(chr(sol[v18]), end='')
print(chr(sol[v19]), end='')
print(chr(sol[v20]), end='')
print(chr(sol[v21]), end='')
print(chr(sol[v22]), end='')
print(chr(sol[v23]), end='')
Easy_Android
public static void main(String[] args) throws NoSuchAlgorithmException {
// md5加密
MessageDigest digest = MessageDigest.getInstance("MD5");
String userName = "Tenshine";
digest.reset();
digest.update(userName.getBytes());
byte[] bytes = digest.digest();
String hexstr = toHexString(bytes, "");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hexstr.length(); i += 2) {
sb.append(hexstr.charAt(i));
}
String userSN = sb.toString();
System.out.println("NSSCTF{" + userSN + "}");
}
private static String toHexString(byte[] bytes, String separator) {
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(b & 255);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex).append(separator);
}
return hexString.toString();
}
Try2Bebug_Plus
将前面的sleep函数patch, 开始动调
Packet
这里是直接使用工具脱壳的, 如果想手动脱壳的可以看 https://zhuanlan.zhihu.com/p/610542968
使用exeinfo 发现是 64位,upx3.91的壳
直接使用 upx -d [文件目录]脱壳,脱完壳后进行代码分析, 可以去 https://upx.github.io/ 下载自己需要的upx
Base64加密,变表了,下面的程序使用的base64表
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/
enc是加密后的字符串,
tLntq1rgE1vqwf8XC19Zmf8Zyxn5Fq==
通过在线解密网站,直接拿到flag
getflag
直接运行,可以看到,需要点击 Click me 100000000次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4u4uMKB1-1682477580347)(null)]
使用ida打开,直接使用 shift + F12 打开字符串搜索,看到 对应的字符串,直接双击进去看
看到了getFlag方法,直接 修改这个if 或者 将getFlag函数的代码拉出来跑
直接修改对应的跳转, 将 jg 指令 改为了 gle 指令
运行,点击getFlag,直接拿到flag