【攻防世界】Reverse——BABYRE writeup

2024-01-07 16:04

本文主要是介绍【攻防世界】Reverse——BABYRE writeup,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面的代码可知:flag的长度是14,通过judge来判断是否成功。但jugde函数是加密过,也就是代码是被混淆过的。所以不可以直接查看。

int __cdecl main(int argc, const char **argv, const char **envp)
{char s[24]; // [rsp+0h] [rbp-20h] BYREFint v5; // [rsp+18h] [rbp-8h]int i; // [rsp+1Ch] [rbp-4h]for ( i = 0; i <= 181; ++i )*((_BYTE *)judge + i) ^= 0xCu;printf("Please input flag:");__isoc99_scanf("%20s", s);v5 = strlen(s);if ( v5 == 14 && (unsigned int)judge((__int64)s) )puts("Right!");elseputs("Wrong!");return 0;
}

main函数中有下面这段代码,它是用来还原或解密代码的。

  for ( i = 0; i <= 181; ++i )*((_BYTE *)judge + i) ^= 0xCu;

解决方法有两个:

1. 静态方法

使用脚本还原代码。在File-》script command中输入脚本:

在“run”后,可看到judge的数值已经发生改变。

选择judge,按“c” 然后“p”,得到下面的代码:

.data:0000000000600B00                 public judge
.data:0000000000600B00 judge           proc near               ; CODE XREF: main+80↑p
.data:0000000000600B00                                         ; DATA XREF: main+16↑r ...
.data:0000000000600B00
.data:0000000000600B00 var_28          = qword ptr -28h
.data:0000000000600B00 var_20          = byte ptr -20h
.data:0000000000600B00 var_1F          = byte ptr -1Fh
.data:0000000000600B00 var_1E          = byte ptr -1Eh
.data:0000000000600B00 var_1D          = byte ptr -1Dh
.data:0000000000600B00 var_1C          = byte ptr -1Ch
.data:0000000000600B00 var_1B          = byte ptr -1Bh
.data:0000000000600B00 var_1A          = byte ptr -1Ah
.data:0000000000600B00 var_19          = byte ptr -19h
.data:0000000000600B00 var_18          = byte ptr -18h
.data:0000000000600B00 var_17          = byte ptr -17h
.data:0000000000600B00 var_16          = byte ptr -16h
.data:0000000000600B00 var_15          = byte ptr -15h
.data:0000000000600B00 var_14          = byte ptr -14h
.data:0000000000600B00 var_13          = byte ptr -13h
.data:0000000000600B00 var_4           = dword ptr -4
.data:0000000000600B00
.data:0000000000600B00                 push    rbp
.data:0000000000600B01                 mov     rbp, rsp
.data:0000000000600B04                 mov     [rbp+var_28], rdi
.data:0000000000600B08                 mov     [rbp+var_20], 66h ; 'f'
.data:0000000000600B0C                 mov     [rbp+var_1F], 6Dh ; 'm'
.data:0000000000600B10                 mov     [rbp+var_1E], 63h ; 'c'
.data:0000000000600B14                 mov     [rbp+var_1D], 64h ; 'd'
.data:0000000000600B18                 mov     [rbp+var_1C], 7Fh
.data:0000000000600B1C                 mov     [rbp+var_1B], 6Bh ; 'k'
.data:0000000000600B20                 mov     [rbp+var_1A], 37h ; '7'
.data:0000000000600B24                 mov     [rbp+var_19], 64h ; 'd'
.data:0000000000600B28                 mov     [rbp+var_18], 3Bh ; ';'
.data:0000000000600B2C                 mov     [rbp+var_17], 56h ; 'V'
.data:0000000000600B30                 mov     [rbp+var_16], 60h ; '`'
.data:0000000000600B34                 mov     [rbp+var_15], 3Bh ; ';'
.data:0000000000600B38                 mov     [rbp+var_14], 6Eh ; 'n'
.data:0000000000600B3C                 mov     [rbp+var_13], 70h ; 'p'
.data:0000000000600B40                 mov     [rbp+var_4], 0
.data:0000000000600B47                 jmp     short loc_600B71
.data:0000000000600B49 ; ---------------------------------------------------------------------------
.data:0000000000600B49
.data:0000000000600B49 loc_600B49:                             ; CODE XREF: judge+75↓j
.data:0000000000600B49                 mov     eax, [rbp+var_4]
.data:0000000000600B4C                 movsxd  rdx, eax
.data:0000000000600B4F                 mov     rax, [rbp+var_28]
.data:0000000000600B53                 add     rax, rdx
.data:0000000000600B56                 mov     edx, [rbp+var_4]
.data:0000000000600B59                 movsxd  rcx, edx
.data:0000000000600B5C                 mov     rdx, [rbp+var_28]
.data:0000000000600B60                 add     rdx, rcx
.data:0000000000600B63                 movzx   edx, byte ptr [rdx]
.data:0000000000600B66                 mov     ecx, [rbp+var_4]
.data:0000000000600B69                 xor     edx, ecx
.data:0000000000600B6B                 mov     [rax], dl
.data:0000000000600B6D                 add     [rbp+var_4], 1
.data:0000000000600B71
.data:0000000000600B71 loc_600B71:                             ; CODE XREF: judge+47↑j
.data:0000000000600B71                 cmp     [rbp+var_4], 0Dh
.data:0000000000600B75                 jle     short loc_600B49
.data:0000000000600B77                 mov     [rbp+var_4], 0
.data:0000000000600B7E                 jmp     short loc_600BA9
.data:0000000000600B80 ; ---------------------------------------------------------------------------
.data:0000000000600B80
.data:0000000000600B80 loc_600B80:                             ; CODE XREF: judge+AD↓j
.data:0000000000600B80                 mov     eax, [rbp+var_4]
.data:0000000000600B83                 movsxd  rdx, eax
.data:0000000000600B86                 mov     rax, [rbp+var_28]
.data:0000000000600B8A                 add     rax, rdx
.data:0000000000600B8D                 movzx   edx, byte ptr [rax]
.data:0000000000600B90                 mov     eax, [rbp+var_4]
.data:0000000000600B93                 cdqe
.data:0000000000600B95                 movzx   eax, [rbp+rax+var_20]
.data:0000000000600B9A                 cmp     dl, al
.data:0000000000600B9C                 jz      short loc_600BA5
.data:0000000000600B9E                 mov     eax, 0
.data:0000000000600BA3                 jmp     short loc_600BB4
.data:0000000000600BA5 ; ---------------------------------------------------------------------------
.data:0000000000600BA5
.data:0000000000600BA5 loc_600BA5:                             ; CODE XREF: judge+9C↑j
.data:0000000000600BA5                 add     [rbp+var_4], 1
.data:0000000000600BA9
.data:0000000000600BA9 loc_600BA9:                             ; CODE XREF: judge+7E↑j
.data:0000000000600BA9                 cmp     [rbp+var_4], 0Dh
.data:0000000000600BAD                 jle     short loc_600B80
.data:0000000000600BAF                 mov     eax, 1
.data:0000000000600BB4
.data:0000000000600BB4 loc_600BB4:                             ; CODE XREF: judge+A3↑j
.data:0000000000600BB4                 pop     rbp
.data:0000000000600BB5                 retn
.data:0000000000600BB5 judge           endp

反编译后可得:

__int64 __fastcall judge(__int64 a1)
{char v2[5]; // [rsp+8h] [rbp-20h] BYREFchar v3[9]; // [rsp+Dh] [rbp-1Bh] BYREFint i; // [rsp+24h] [rbp-4h]qmemcpy(v2, "fmcd", 4);v2[4] = 127;qmemcpy(v3, "k7d;V`;np", sizeof(v3));for ( i = 0; i <= 13; ++i )*(_BYTE *)(i + a1) ^= i;for ( i = 0; i <= 13; ++i ){if ( *(_BYTE *)(i + a1) != v2[i] )return 0LL;}return 1LL;
}

输出flag:

v2='fmcd'+chr(127)+'k7d;V`;np'flag = ''
for i in range(14):flag+= chr(ord(v2[i])^i)print(flag)

方法2:动态方法

在 if ( v5 == 14 && (unsigned int)judge((__int64)s) ) 这行下断点,这时解密方法已经执行,也就是可以跳转到judge函数查看解密后的代码。

这篇关于【攻防世界】Reverse——BABYRE writeup的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/580490

相关文章

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

简单的Q-learning|小明的一维世界(3)

简单的Q-learning|小明的一维世界(1) 简单的Q-learning|小明的一维世界(2) 一维的加速度世界 这个世界,小明只能控制自己的加速度,并且只能对加速度进行如下三种操作:增加1、减少1、或者不变。所以行动空间为: { u 1 = − 1 , u 2 = 0 , u 3 = 1 } \{u_1=-1, u_2=0, u_3=1\} {u1​=−1,u2​=0,u3​=1}

简单的Q-learning|小明的一维世界(2)

上篇介绍了小明的一维世界模型 、Q-learning的状态空间、行动空间、奖励函数、Q-table、Q table更新公式、以及从Q值导出策略的公式等。最后给出最简单的一维位置世界的Q-learning例子,从给出其状态空间、行动空间、以及稠密与稀疏两种奖励函数的设置方式。下面将继续深入,GO! 一维的速度世界 这个世界,小明只能控制自己的速度,并且只能对速度进行如下三种操作:增加1、减

【Linux】萌新看过来!一篇文章带你走进Linux世界

🚀个人主页:奋斗的小羊 🚀所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言💥1、初识Linux💥1.1 什么是操作系统?💥1.2 各种操作系统对比💥1.3 现代Linux应用💥1.4 Linux常用版本 💥2、Linux 和 Windows 目录结构对比💥2.1 文件系统组织方式💥2.2

Elasticsearch:无状态世界中的数据安全

作者:来自 Elastic Henning Andersen 在最近的博客文章中,我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储(例如 Amazon S3),我们获得了许多优势和简化。 从历史上看,Elasticsearch 依靠本地磁盘持久性来确保数据安全并处理陈旧或孤立的节点。在本博客中,我们将讨论无状态的数据持

【AI大模型应用开发】2.1 Function Calling连接外部世界 - 入门与实战(1)

Function Calling是大模型连接外部世界的通道,目前出现的插件(Plugins )、OpenAI的Actions、各个大模型平台中出现的tools工具集,其实都是Function Calling的范畴。时下大火的OpenAI的GPTs,原理就是使用了Function Calling,例如联网检索、code interpreter。 本文带大家了解下Function calling,看

005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体 左侧是成像结果                                                    右侧是世界坐标系中的相机与被观察物体 目录 VTK医学图像处理---世界坐标系中的相机和物体 简介 1 在三维空间中添加坐标系 2 世界坐标系中的相机 3 世界坐标系中vtkImageData的参数 总结:

leetcode#541. Reverse String II

题目 Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of

深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念

文章目录 文章导图RabbitMQ架构及相关概念四大核心概念名词解读 七大工作模式及四大交换机类型0、前置了解-默认交换机DirectExchange1、简单模式(Simple Queue)-默认DirectExchange2、 工作队列模式(Work Queues)-默认DirectExchange3、发布/订阅模式(Publish/Subscribe)-FanoutExchange4、路