一天一道CTF题目,能多不能少
下载文件,运行,发现运行不动
直接用ida打开找主函数,太简洁不可能:
进入sub_401100:
int sub_401100()
{
signed int v0; // esi
signed int v1; // esi
unsigned int v2; // edi
void **v3; // ebx
void **v4; // eax
int v5; // ecx
int v6; // ST04_4
int v7; // ST08_4
int v8; // ST0C_4
int v9; // eax
int v10; // ST0C_4
char *v11; // esi
int v12; // ecx
void **v13; // eax
int v14; // eax
int v15; // ST0C_4
int v16; // eax
int v17; // ST0C_4
int v18; // eax
int v19; // ST0C_4
int v20; // eax
int v21; // ST0C_4
int v22; // eax
int v23; // ST0C_4
int v24; // eax
int v25; // ST0C_4
int v26; // eax
int v27; // ST0C_4
int v28; // eax
int result; // eax
int v30; // [esp-4h] [ebp-13Ch]
int Dst; // [esp+14h] [ebp-124h]
char v32[4]; // [esp+20h] [ebp-118h]
char v33; // [esp+24h] [ebp-114h]
int v34; // [esp+5Ch] [ebp-DCh]
char v35; // [esp+61h] [ebp-D7h]
int v36; // [esp+64h] [ebp-D4h]
int v37; // [esp+68h] [ebp-D0h]
char v38; // [esp+6Ch] [ebp-CCh]
FILE *File; // [esp+70h] [ebp-C8h]
char v40; // [esp+84h] [ebp-B4h]
void *v41; // [esp+CCh] [ebp-6Ch]
int v42; // [esp+DCh] [ebp-5Ch]
unsigned int v43; // [esp+E0h] [ebp-58h]
void *v44; // [esp+E4h] [ebp-54h]
int v45; // [esp+F4h] [ebp-44h]
unsigned int v46; // [esp+F8h] [ebp-40h]
void *Memory[4]; // [esp+FCh] [ebp-3Ch]
int v48; // [esp+10Ch] [ebp-2Ch]
unsigned int v49; // [esp+110h] [ebp-28h]
__int128 v50; // [esp+114h] [ebp-24h]
__int16 v51; // [esp+124h] [ebp-14h]
char v52; // [esp+126h] [ebp-12h]
int v53; // [esp+134h] [ebp-4h]
v46 = 15;
v45 = 0;
LOBYTE(v44) = 0;
v53 = 0;
v43 = 15;
v42 = 0;
LOBYTE(v41) = 0;
LOBYTE(v53) = 1;
v0 = 0;
v48 = 1684630885;
LOWORD(v49) = 97;
*(_OWORD *)Memory = xmmword_40528C;
v51 = 11836;
v52 = 0;
v50 = xmmword_4052A4;
do
{
sub_4021E0(1u, (*((_BYTE *)Memory + v0) ^ *((_BYTE *)&v50 + v0)) + 22);
++v0;
}
while ( v0 < 18 );
v1 = 0;
v49 = 15;
v48 = 0;
LOBYTE(Memory[0]) = 0;
LOBYTE(v53) = 2;
v2 = v43;
v3 = (void **)v41;
do
{
v4 = &v41;
if ( v2 >= 0x10 )
v4 = v3;
sub_4021E0(1u, *((_BYTE *)v4 + v1++) + 9);
}
while ( v1 < 18 );
memset(&Dst, 0, 0xB8u);
sub_401620(v5, v6, v7, v8);
LOBYTE(v53) = 3;
if ( v32[*(_DWORD *)(Dst + 4)] & 6 )
{
v9 = sub_402A00(std::cerr, "?W?h?a?t h?a?p?p?e?n?", sub_402C50);
std::basic_ostream>::operator<<(v9, v10);
exit(-1);
}
sub_402E90(&Dst, &v44);
v11 = &v33;
if ( File )
{
if ( !(unsigned __int8)sub_4022F0(&v33) )
v11 = 0;
if ( fclose(File) )
v11 = 0;
}
else
{
v11 = 0;
}
v38 = 0;
v35 = 0;
std::basic_streambuf>::_Init(&v33);
v36 = dword_408590;
File = 0;
v37 = dword_408594;
v34 = 0;
if ( !v11 )
std::basic_ios>::setstate((char *)&Dst + *(_DWORD *)(Dst + 4), 2, 0);
v13 = Memory;
if ( v49 >= 0x10 )
v13 = (void **)Memory[0];
if ( sub_4020C0(v12, v45, v13, v48) )
{
v28 = sub_402A00(std::cout, "=W=r=o=n=g=K=e=y=", sub_402C50);
}
else
{
v14 = sub_402A00(std::cout, "|------------------------------|", sub_402C50);
std::basic_ostream>::operator<<(v14, v15);
v16 = sub_402A00(std::cout, "|==============================|", sub_402C50);
std::basic_ostream>::operator<<(v16, v17);
v18 = sub_402A00(std::cout, "|==============================|", sub_402C50);
std::basic_ostream>::operator<<(v18, v19);
v20 = sub_402A00(std::cout, "|==============================|", sub_402C50);
std::basic_ostream>::operator<<(v20, v21);
v22 = sub_402A00(std::cout, "\\ /\\ /\\ /\\ /\\==============|", sub_402C50);
std::basic_ostream>::operator<<(v22, v23);
v24 = sub_402A00(std::cout, " \\/ \\/ \\/ \\/ \\=============|", sub_402C50);
std::basic_ostream>::operator<<(v24, v25);
v26 = sub_402A00(std::cout, " |-------------|", sub_402C50);
std::basic_ostream>::operator<<(v26, v27);
std::basic_ostream>::operator<<(std::cout, sub_402C50);
v28 = sub_402A00(std::cout, "Congrats You got it!", sub_402C50);
}
std::basic_ostream>::operator<<(v28, v30);
sub_401570(&v40);
std::basic_ios>::~basic_ios>(&v40);
if ( v49 >= 0x10 )
sub_402630(Memory[0], v49 + 1);
if ( v2 >= 0x10 )
sub_402630(v3, v2 + 1);
result = v46;
if ( v46 >= 0x10 )
result = sub_402630(v44, v46 + 1);
return result;
}
直接查看字符串look一下:
发现奇怪的东西?这个目录下的flag.txt?
找到调用该处的函数:
最后发现,该函数在主函数的sub_401620中调用!
直接在这个目录下构建一下这个文件,看看有不有什么效果,文件中乱写一些东西
发现还是不能运行,,,,直接用OD看看能不能打开:
发现是输出错误的key???
那如果没有这个文件呢?
结果发现是:
像极了我现在的心情!what happen?
首先回到wrong的key那,说明肯定有比较,毕竟是有if的
应该是将文件内容与加密的字符比较,不过我们加密的字符我们不知道
就进行分析,最后发现,v13这个变量有问题!!!!
直接根据逻辑来
一开始是有两个字符串:
这两个字符串是知道的!!!:
这就好办了,直接根据逻辑来编写脚本,看看最后的v13等于什么东西:
s1 = "themidathemidathemida"
s2 = ">----++++....<<<<."
flag1 = ""
flag=""
for i in range(len(s2)):
flag1 += chr((ord(s1[i])^ord(s2[i]))+22)
for i in flag1:
flag +=chr(ord(i)+9)
print(flag)
运行得到一串字符
这啥玩意啊,看着又不像字符串的~~
又想了一会,发现这个如果是加密后的字符串的话,那么这就是被比较的字符串
不管那么多了,直接提交试试看再说!
发现这就是flag,我也是服了!!!
最后觉得这个题用OD直接调不是更好???有比较
直接查看一下就好了???搞不懂搞不懂!!!!
下载文件打开,发现存在三个文件~~
后来发现有elf的文件,还有exe的文件,不过内容基本都一样
只不过这三个文件只是运行环境不一样而已,这里我用的是elf文件:
首先输入一个字符串,然后进行check_key函数进行检查
如果不对则返回wrong
然后具体看了下interesting_function函数:
看上去有点复杂,,,取4个字节进行异或,后面又是一个循环,,,,
但是我们输入得字符也不能保证正确啊!
再看看check_key函数:
,,,,我看你是在为难我胖虎!
自己输入的为参数,,,,,,,
直接用gdb动态调试吧,,,,
(关于GDB调试指令,可借阅两位大佬的博文:GDB调试实用命令 | GDB调试入门)
输入命令:
gdb-peda$ ./task9_x86_64_46d01fe312d35ecf69c4ff8ab8ace75d080891dc
gdb-peda$ br main
gdb-peda$ r
然后执行到输入key的位置,发现check_key函数的比较(test指令)??
直接查看eax里面的值:
很显然,我们输入的key是错误的嘛,所以比较的值肯定是0嘛
所以我们就可以清楚看见eax中为0,
那我们就直接修改eax中的值为1
然后继续执行:
得到一串东西???直接提交,发现就是flag
看来这种检查机制还是有危险的,直接修改比较的值就能够绕过check
flag:flag_is_you_know_cracking!!!