whyida 发表于 2017-11-9 11:14

一道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 的提醒,修改一处错误。

whyida 发表于 2017-11-9 14:12

9152pojie 发表于 2017-11-9 13:34
怎么一下跑到python了,,,,

linux中许多地方需要用python。

Dispa1r 发表于 2017-12-1 08:41

zeromovie 发表于 2017-11-9 16:43
感谢楼主帮忙解题,问下tmp2是怎么得来的呢

tmp2楼主搞错了我感觉,【0x61, 0x64, 0x6d, 0x69, 0x6e, 0x61, 0x64, 0x6d,0x69,0x6E,0x31,0x32,0x33,0x31,0x32,0x33】,我感觉是这个,跑出来也没问题

李庆喜 发表于 2017-11-9 13:11

膜拜 正在学python{:1_921:}{:1_921:}{:1_921:}

9152pojie 发表于 2017-11-9 13:34

怎么一下跑到python了,,,,

极地冷战 发表于 2017-11-9 14:34

支持新人

MAXtoDEATH 发表于 2017-11-9 14:36

楼上说支持新人的你看看lz比你高几权。。。

vv乐乐ai 发表于 2017-11-9 15:12

赞赞赞赞赞赞赞赞赞赞赞赞

zeromovie 发表于 2017-11-9 16:43

感谢楼主帮忙解题,问下tmp2是怎么得来的呢

whyida 发表于 2017-11-9 17:36

zeromovie 发表于 2017-11-9 16:43
感谢楼主帮忙解题,问下tmp2是怎么得来的呢

主函数中:v4 = 0x6D64616E696D6461LL;在调试器中可以看到取字的完整过程。

亿联网络 发表于 2017-11-9 18:16

kali 就很6了,楼主渗透会不会,发点教程
页: [1] 2 3
查看完整版本: 一道linux ctf入门题逆向。