您的位置:首页 > 其它

攻防世界WP-reverse-Reversing-x64Elf-100

2020-04-23 12:12 507 查看

无壳,64位elf程序。直接拖入IDA。发现Nice字符串,双击进去。F5查看伪代码。

signed __int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
signed __int64 result; // rax
char s; // [rsp+0h] [rbp-110h]
unsigned __int64 v5; // [rsp+108h] [rbp-8h]

v5 = __readfsqword(0x28u);
printf("Enter the password: ", a2, a3);
if ( !fgets(&s, 255, stdin) )
return 0LL;
if ( (unsigned int)sub_4006FD((__int64)&s) )
{
puts("Incorrect password!");
result = 1LL;
}
else
{
puts("Nice!");
result = 0LL;
}
return result;
}

sub_4006FD
为判断的关键,接着进去。

signed __int64 __fastcall sub_4006FD(__int64 a1)
{
signed int i; // [rsp+14h] [rbp-24h]
const char *v3; // [rsp+18h] [rbp-20h]
const char *v4; // [rsp+20h] [rbp-18h]
const char *v5; // [rsp+28h] [rbp-10h]

v3 = "Dufhbmf";
v4 = "pG`imos";
v5 = "ewUglpt";
for ( i = 0; i <= 11; ++i )
{
if ( (&v3)[i % 3][2 * (i / 3)] - *(char *)(i + a1) != 1 )
return 1LL;
}
return 0LL;
}

代码看起来很简单,但是一开始有个地方把我卡住了,就是

v3v4v5
的关系。在
for
循环内,没有
v4
v5
,我以为这两个变量没用,但是通过循环体内的
if
判断可知,
v3
是一个二维数组(但是为什么伪代码会这样?多维数组在伪代码中都是这样表示的吗?)
还有1个地方需要捋一捋,
*(char *)(i + a1)
a1
是取输入
flag
的地址
(i+a1)
表示地址加1,转换成
char
类型的指针,然后取首字符。

解密代码如下:

#include <iostream>
using namespace std;
int fff()
{
signed int i; // [rsp+14h] [rbp-24h]

string str[] = {"Dufhbmf","pG`imos","ewUglpt"};
char a[13]={0};//初始化的时候,多放一个0进去,表示字符串截至,不然输出字符串后会烫烫烫
for ( i = 0; i <= 11; ++i )
{
a[i] = (str)[i % 3][2 * (i / 3)]-1;
}
cout<<a;
return 0;
}
int main()
{
fff();
system("pause");
return 0;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
wallacegen 发布了16 篇原创文章 · 获赞 0 · 访问量 195 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: