算法分析一道逆向CTF题

网友投稿 1195 2022-09-14

算法分析一道逆向CTF题

算法分析一道逆向CTF题

1.-查壳,跑一遍

提示输入,随便输入后结束程序2.使用IDA静态分析,拖进去直接F5伪代码分析

if ( v7 ) v7 = v7 < 0 ? -1 : 1; if ( !v7 ) { sub_401020("right\n", Arglist[0]); system("pause");

}

从伪代码中可以看到关键字符"right\n",那这里可以直接看出这个sub_401020指定就是输入正确后的提示函数,但是要执行sub_401020函数则需要v7是一个非零的数,那么我们就跟踪v7,可以从整个main函数中看到,对v7变量做出更改的只有一下两个地方v7 = strcmp(byte_40336C, aXircjR2twsv3pt);

if ( v7 )

v7 = v7 < 0 ? -1 : 1;

第一个地方v7是byte_40336C变量与aXircjR2twsv3pt变量strcmp的返回值,第二个地方v7无论怎么样都是非零数,所以第二个地方的v7就不影响提示输入正确的函数sub_401020("right\n", Arglist[0]),那只有第一个地方的了,化简后的对比代码如下v7 = strcmp(byte_40336C, aXircjR2twsv3pt);

if ( !v7 )

{ sub_401020("right\n", Arglist[0]); system("pause"); }

shift+e把aXircjR2twsv3pt提取出来先放好,继续查看aXircjR2twsv3pt与byte_40336C存在的逻辑for ( i = 0; i < 0x18; ++i )

byte_40336C[i] = (byte_40336C[i] + 1) ^ 6;

我们刚才得到最后的byte_40336C正确的满足条件就是等于aXircjR2twsv3pt,那在上面的代码中就只存在一个未知数:每次循环前的byte_40336C,那我们先用刚才提取出的aXircjR2twsv3pt写脚本推导出每次循环前的byte_40336C,代码如下:#include

#include

int main()

{

unsigned char aXircjR2twsv3pt[] = { 0x78, 0x49, 0x72, 0x43, 0x6A, 0x7E, 0x3C, 0x72, 0x7C, 0x32, 0x74, 0x57, 0x73, 0x76, 0x33, 0x50, 0x74, 0x49, 0x7F, 0x7A, 0x6E, 0x64, 0x6B, 0x61, 0x00, 0x00, 0x00, 0x00 }; char get[24]; for (size_t i = 0; i < 0x18; i++) { get[i] = (aXircjR2twsv3pt[i] ^ 6) - 1; } for (size_t i =0; i < 0x17; i++) { printf("%c", get[i]); } system("pause");

}

脚本如下:#include

#include

int main()

{

char aXircjR2twsv3pt[] = { 0x78, 0x49, 0x72, 0x43, 0x6A, 0x7E, 0x3C, 0x72, 0x7C, 0x32, 0x74, 0x57, 0x73, 0x76, 0x33, 0x50, 0x74, 0x49, 0x7F, 0x7A, 0x6E, 0x64, 0x6B, 0x61, 0x00, 0x00, 0x00, 0x00 }; char get[24]; for (size_t i = 0; i < 0x18; i++) { get[i] = (aXircjR2twsv3pt[i] ^ 6) - 1; } for (size_t i = 0x17; i >=0; i--) { printf("%c", get[i]); } system("pause");

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据类型和特殊类型-C#(数据类型哪几种)
下一篇:Win10基础 查看自己所用的公网IP地址
相关文章

 发表评论

暂时没有评论,来抢沙发吧~