依旧先查壳(看几位)
没壳64位
考虑IDA或者OD都行(看个人习惯,OD需要很大的功底)建议先从IDA开始
拖入IDA看看
发现没有想要的东西 --> shift+F12 -->(可以ctrl+F) --> 也可一个个找关键字flag
发现right flag --> 点进去
在数据段上(不能操作)没有任何作用 --> ctrl+x(查看是谁调用了这段数据)(这里注意,一定要选中这行数据,要不然显示不出来)
发现有一个调用了它,点击OK进入
来到主函数这边的“流程图”了
这里可以选择两种
一种看着汇编代码直接弄就好了
一种摁F5查看伪代码
__int64 sub_1400118C0()
{
char *v0; // rdi
__int64 i; // rcx
size_t v2; // rax
size_t v3; // rax
char v5[36]; // [rsp+0h] [rbp-20h] BYREF
int j; // [rsp+24h] [rbp+4h]
char Str1[224]; // [rsp+48h] [rbp+28h] BYREF
unsigned __int64 v8; // [rsp+128h] [rbp+108h]
v0 = v5;
for ( i = 82i64; i; --i )
{
*(_DWORD *)v0 = -858993460;
v0 += 4;
}
for ( j = 0; ; ++j )
{
v8 = j;
v2 = j_strlen(Str2);
if ( v8 > v2 )
break;
if ( Str2[j] == 111 )
Str2[j] = 48;
}
sub_1400111D1("input the flag:");
sub_14001128F("%20s", Str1);
v3 = j_strlen(Str2);
if ( !strncmp(Str1, Str2, v3) )
sub_1400111D1("this is the right flag!\n");
else
sub_1400111D1("wrong flag\n");
sub_14001113B(v5, &unk_140019D00);
return 0i64;
}
首先先看正确的flag怎么出来的
有个判断
strncmp --> 通过参数的传递比较是否相同,相同返回 0。
这里写的是用 Str1 和 Str2 比较 v3 个字符,相同就输出字符串“this is the right flag!\n”
问题来了, Str1 和 Str2 我们都不知道昂,怎么比较?--> 依次双击 Str1 和 Str2
Str1在空的数据段,应该是要我们自己写
Str2 以字节定义了一段字符串‘{hello_world}’和一个数据 0 (没用,这个数据)
答案就出来了,使 Str1 和 Str2 相同就行,但是还没完,再仔细看看代码,Str2比较前还有处理
111和48是啥 --> ASCII码 --> 可以自己查,也可以选中这个数据,然后摁“R”,在IDA中可以自动转化
明显是要我们将Str2中的所有'o'转化'0'
所以flag{hell0_w0rld}收工