逆向工程 RE50 wp

此处附上下载链接RE50.exe


首先先打开它运行一下

这里写图片描述

然后再放到PEiD exeinfo(反正都看看就对了 = =)中看看

这里写图片描述

win 32位

这里写图片描述

C++编写

随便输了一下 发现并没有什么结果 (゚⊿゚)ツ

拖到IDA32里看看
这里写图片描述

F5反编译找伪代码(要是没了F5该怎么办啊 啧啧|・ω・`)
这里写图片描述

看到主函数中的if判断语句 如果条件满足 则执行wrong 所以要使条件不满足
我们继续往sub_401000中看
v4是我们的输入 也就是我们要找的flag
(一开始的时候去put里看了一下 哇 看得我眼花缭乱)

这里写图片描述

又到了非常无聊的分析代码的时刻(叹气

bool __thiscall sub_401000(char *this) //this=&v4
{
int v1; // eax
bool result; // al
char v3; // dl
char v4[48]; // [esp+0h] [ebp-40h] //v4 v5 v6是一个连续的数组
int v5; // [esp+30h] [ebp-10h] //30对应的10进制是48 所以v4 v5相连
int v6; // [esp+34h] [ebp-Ch] //char是一个字节 int是四个字节 所以v5 v6相连
char v7; // [esp+38h] [ebp-8h]
v1 = *this;
v5 = 33687816; //转化为十进制是0x2020908 小端模式和大端模式
v6 = 151191814; //转化为十进制是0x9030106
v7 = 0;
if ( v4[v1] != 2
 || v4[this[1]] != 8
 || v4[this[2]] != 9
 || v4[this[3]] != 3
 || v4[this[4]] != 9
 || (v3 = v4[this[7]], v4[this[5]] != v3)
 || v4[this[6]] != 9 )
{
 result = 0;
}
else
{
 result = v3 == 8; //OD反汇编的时候把v3的值显示出来了
}
return result;
}

这段代码中的If语句里面的语言是或 如果这些或都满足 那么就执行result=0 返回0值 则在上一屏中的代码中的If就是非0(非0为1 非1为0) 所以将会执行wrong

由此得出 若想执行上一屏else那句 就需要使它的值为真值 也就是要result=v3==8 (๑`꒳´๑)

于是我们通过分析可以知道

v4[v1] == 2
v4[this[1]] == 8
v4[this[2]] == 9
v4[this[3]] == 3
v4[this[4]] == 9
v4[this[7]] == v4[this[5]] == v3 ==8
v4[this[6]] == 9

v4[] ={8,9,2,2,6,1,3,9} //注意存储的顺序

这里写图片描述

由数组元素下标和数组元素值的对应关系可以推出this[]数组的值 即flag为
20767070或20161010或30767070或30161010等共16种

因此flag不唯一 (ꐦಠ ಠ)


理解了半天才明白 我大概是太迟钝了= =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值