BMZCTF Reverse4

本文介绍了一段涉及字符串操作及base64加密解密的逆向工程过程。通过分析程序代码,揭示了如何通过解密预设字符串来获得正确的flag,最终实现正确答案的输出。

载入OD

搜索字符串

 

 

随意输入1111111111111111111

发现进行了base64加密

再向下单步 发现、

结合IDA看下

int sub_4156E0()

{

size_t v0;// eax@6

constchar*v1;// eax@6

size_t v2;// eax@9

char v4;// [sp+0h] [bp-188h]@6

char v5;// [sp+Ch] [bp-17Ch]@1

size_t v6;// [sp+10h] [bp-178h]@3

size_t j;// [sp+DCh] [bp-ACh]@6

size_t i;// [sp+E8h] [bp-A0h]@1

char Dest[108];// [sp+F4h] [bp-94h]@5

char Str;// [sp+160h] [bp-28h]@6

char v11;// [sp+17Ch] [bp-Ch]@6

unsignedint v12;// [sp+184h] [bp-4h]@1

int savedregs;// [sp+188h] [bp+0h]@1

memset(&v5,0xCCu,0x17Cu);

v12 =(unsignedint)&savedregs ^ __security_cookie;

for( i =0;(signedint)i <100;++i )

{

v6 = i;

if( i >=0x64)

sub_411154();

Dest[v6]=0;

}

sub_41132F("please enter the flag:", v4);

sub_411375("%20s",(unsignedint)&Str);

v0 = j_strlen(&Str);

v1 =(constchar*)sub_4110BE(&Str, v0,&v11);

strncpy(Dest, v1,'(');

sub_411127();

i = j_strlen(Dest);

for( j =0;(signedint)j <(signedint)i;++j )

Dest[j]+= j;

v2 = j_strlen(Dest);

strncmp(Dest, Str2, v2);

if( sub_411127())

sub_41132F("wrong flag!\n", v4);

else

sub_41132F("rigth flag!\n", v4);

sub_41126C(&savedregs,&dword_415890);

sub_411280();

return sub_411127();

}

 

 

 

 

分析可知:将输入的串Str1先进行base64加密 再与串Str2比较 若相等 则输出"right flag"

 

由此,我们只需将Str2也就是"e3nifIH9b_C@n@dH"进行解密即可

 

Python脚本:

import base64

s ="e3nifIH9b_C@n@dH"

flag =""

for i in range(len(s)):

flag += chr(ord(s[i])- i)

flag = base64.b64decode(flag)

print(flag)

 

所以得到flag{i_l0ve_you}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白帽子社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值