下载文件放入ida64
照常找字符串
看到可疑的字符串 进去看看
到了主函数来
我们可以开始看看
int v4; // [rsp+14h] [rbp-Ch]
unsigned __int64 v5; // [rsp+18h] [rbp-8h]
v5 = __readfsqword(0x28u);
welcome(*(_QWORD *)&argc, argv, envp);
puts("_________________");
puts("try to patch me and find flag");
v4 = 0;
puts("please input a lucky number");
__isoc99_scanf("%d", &v4);
前面都是人机交互的内容 不是很重要
这里有一个函数 patch_me() 我们进去看看
patch_me(v4);
puts("OK,see you again");
return 0;
int __fastcall patch_me(int a1)
{
int result; // eax
if ( a1 % 2 == 1 ) 判断是不是整数
result = puts("just finished");
else
result = get_flag(); 又是一个重要的函数 我们进去看看
return result;
}
这题的考点出现了
我们注意到这个flag的东西 我们进去f1看看
得到flag的一半
GXY{do_not_
f2呢
没有东西
这个函数很显然是输入数字 如果是1输出什么 是5输出什么
所以我们看到有一个函数是对f2进行处理
这里的s =0x7F666F6067756369LL
但是是小端序
所以我们改
s=[0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f]
然后就是对f2的拼接
对f2的处理
case 5:
for ( j = 0; j <= 7; ++j )
{
if ( j % 2 == 1 )
v1 = *(&f2 + j) - 2; *(&f2 + j)就是对f2的遍历
else
v1 = *(&f2 + j) - 1;
*(&f2 + j) = v1;
}
break;
我们可以看看开始编写exp
flag='GXY{do_not_'
s=[0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f]
a=''
for j in range(8): #循环
if j % 2 == 1:
a=chr(int(s[j])-2)
else:
a = chr(int(s[j]) - 1)
flag+=a
print(flag)
GXY{do_not_hate_me}