查壳,除壳,ida打开
直接找到main函数
观察字符串
flag{HappyNewYear!}
先查壳,发现没壳,拉进IDA。
Start 函数中调用了sub_10030函数,进去查看
直接查看汇编,这是一个由8086汇编写成的程序。第一段数据段是将这串字符串写入物理地址,并取名aUDuTZWjQGjzZWz。
接下来则是代码段,就是刚才的死循环段。但是后面还有一串数据,估计就是真正的代码。选中,按C,选force,强制转换成汇编。
这里是循环0x22次。字符串和0x1f抑或,抑或的结果就是flag了。
a = ']U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b'
flag = ''
for i in a:
flag += chr(ord(i)^0x1F)
print(flag)
BJD{jack_de_hu1b1an_xuede_henHa0}
此部分借鉴自https://blog.csdn.net/qq_44625297/article/details/105158182
直接ida打开
查看main函数及其伪代码
1 int __cdecl main(int argc, const char **argv, const char **envp)
2 {
3 char *v3; // rsi
4 int result; // eax
5 signed int i; // [rsp+2Ch] [rbp-124h]
6 char v6[264]; // [rsp+40h] [rbp-110h]
7 __int64 v7; // [rsp+148h] [rbp-8h]
8
9 memset(v6, 0, 0x100uLL);
10 v3 = (char *)256;
11 printf("Input your flag:\n", 0LL);
12 get_line(v6, 256LL);
13 if ( strlen(v6) != 33 )
14 goto LABEL_12;
15 for ( i = 1; i < 33; ++i )
16 v6[i] ^= v6[i - 1];
17 v3 = global;
18 if ( !strncmp(v6, global, 0x21uLL) )
19 printf("Success", v3);
20 else
21 LABEL_12:
22 printf("Failed", v3);
23 result = __stack_chk_guard;
24 if ( __stack_chk_guard == v7 )
25 result = 0;
26 return result;
27 }
分析可知,flag长度为33位(15,16的循环语句)
并且我们可以得到语句的处理方式,将global反向处理即可
脚本
str1 = ['f', 0x0A, 'k', 0x0C, 'w', '&', 'O', '.', '@', 0x11, 'x', 0x0D, 'Z', ';', 'U', 0x11, 'p', 0x19, 'F', 0x1F, 'v',
'"', 'M', '#', 'D', 0x0E, 'g', 6, 'h', 0x0F, 'G', '2', 'O']
x = 'f'
for i in range(1, len(str1)):
if (isinstance(str1[i], str)):
if (isinstance(str1[i - 1], str)):
x += chr(ord(str1[i]) ^ ord(str1[i - 1]))
else:
x += chr(ord(str1[i]) ^ str1[i - 1])
else:
x += chr(str1[i] ^ ord(str1[i - 1]))
print(x)
(脚本借鉴自https://www.cnblogs.com/Mayfly-nymph/p/11461575.html)
flag{QianQiuWanDai_YiTongJiangHu}
文件直接ida,32位不行就64位
打开找到main函数,f5查看伪代码
发现Detry()应该是判断函数
打开继续查看
淦,不会了
开始百度
http://shangdixinxi.com/detail-1448227.html
查壳,无壳,ida打开
妈的这出题人是智障
真的内涵
一看就看出来了
int __cdecl main_0()
{
int result; // eax
char v1; // [esp+4Ch] [ebp-Ch]
const char *v2; // [esp+50h] [ebp-8h]
int v3; // [esp+54h] [ebp-4h]
v3 = 5;
v2 = "DBAPP{49d3c93df25caad81232130f3d2ebfad}";
while ( v3 >= 0 )
{
printf(aD, v3);
sub_40100A();
--v3;
}
printf(
"\n"
"\n"
"\n"
"这里本来应该是答案的,但是粗心的程序员忘记把变量写进来了,你要不逆向试试看:(Y/N)\n");
v1 = 1;
scanf("%c", &v1);
if ( v1 == 89 )
{
printf(aOdIda);
result = sub_40100A();
}
else
{
if ( v1 == 78 )
printf(asc_425034);
else
printf("输入错误,没有提示.");
result = sub_40100A();
}
return result;
}
flag就是花括号包的部分
flag{49d3c93df25caad81232130f3d2ebfad}
(持续更新…)