一道linux ctf入门题逆向。
本帖最后由 whyida 于 2017-12-1 11:45 编辑下载地址:
https://www.52pojie.cn/forum.php ... &page=3#pid17643200
先用ida分析,main 函数入口。
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
__int64 v4; //
__int64 v5; //
__int16 v6; //
int v7; //
int v8; //
int i; //
puts("welcome");
v4 = 0x6D64616E696D6461LL;
v5 = 0x3332313332316E69LL;
v6 = 51;
v8 = 0;
for ( i = 0; i <= 16; ++i )
{
v7 = rand() % 255;
if ( (unsigned int)check(v7, *((char *)&v4 + i), i) )
++v8;
}
if ( v8 == 17 )
result = puts("good job,now you know what is flag!");
else
result = puts("wrong\ntry again!!!");
return result;
}
check 函数
signed __int64 __fastcall check(unsigned int a1, unsigned int a2, int a3)
{
int v4; //
int v5; //
int v6; //
int v7; //
int v8; //
int v9; //
int v10; //
int v11; //
int v12; //
int v13; //
int v14; //
int v15; //
int v16; //
int v17; //
int v18; //
int v19; //
int v20; //
v4 = 7;
v5 = 8;
v6 = 12;
v7 = 14;
v8 = 21;
v9 = 13;
v10 = 13;
v11 = 3;
v12 = 28;
v13 = 22;
v14 = 110;
v15 = 93;
v16 = 64;
v17 = 110;
v18 = 93;
v19 = 88;
v20 = 78;
if ( (a2 ^ a1) != *(&v4 + a3) )
return 0LL;
printf("%d,%d,%d\n", a1, a2, (unsigned int)*(&v4 + a3));
putchar(a2 ^ a1);
return 1LL;
}
关键代码
if ( (a2 ^ a1) != *(&v4 + a3) )
只要算出随机数就可得到flag
也就是a1=*(&v4 + a3) ^a2
tmp=
tmp2=
t=[]
for i in range(16):
t= ((tmp)^(tmp2))
print(chr(t),end='')
感谢 Dispa1r 的提醒,修改一处错误。
9152pojie 发表于 2017-11-9 13:34
怎么一下跑到python了,,,,
linux中许多地方需要用python。 zeromovie 发表于 2017-11-9 16:43
感谢楼主帮忙解题,问下tmp2是怎么得来的呢
tmp2楼主搞错了我感觉,【0x61, 0x64, 0x6d, 0x69, 0x6e, 0x61, 0x64, 0x6d,0x69,0x6E,0x31,0x32,0x33,0x31,0x32,0x33】,我感觉是这个,跑出来也没问题 膜拜 正在学python{:1_921:}{:1_921:}{:1_921:} 怎么一下跑到python了,,,,
支持新人 楼上说支持新人的你看看lz比你高几权。。。 赞赞赞赞赞赞赞赞赞赞赞赞 感谢楼主帮忙解题,问下tmp2是怎么得来的呢 zeromovie 发表于 2017-11-9 16:43
感谢楼主帮忙解题,问下tmp2是怎么得来的呢
主函数中:v4 = 0x6D64616E696D6461LL;在调试器中可以看到取字的完整过程。
kali 就很6了,楼主渗透会不会,发点教程