patchme

Posted by Humb1e on 2023-02-22
Estimated Reading Time 2 Minutes
Words 719 In Total
Viewed Times

HGAME REVERSE WEEK3

之前是按照出题人的思路进行patch得到的flag,这次想尝试一下直接逆向得到答案

image-20230222144725798

这是其中的一个比较重要的加密过程

可以看到i的作用是类似于寻找地址

之后的mprotect是用来修改指定内存区域属性的,并且这个函数是再Linux下的

1
2
3
#include <unistd.h>   
#include <sys/mmap.h>
int mprotect(const void *start, size_t len, int prot);

这就是函数原型

mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值。

prot可以取以下几个值,并且可以用“|”将几个属性合起来使用:

1)PROT_READ:表示内存段内的内容可读;

2)PROT_WRITE:表示内存段内的内容可写;

3)PROT_EXEC:表示内存段中的内容可执行;

4)PROT_NONE:表示内存段中的内容根本没法访问。

image-20230222145443578

可以看到,mprotect修改的内存区域与之后的加密区域是重合的

所以下面的加密操作其实是对内存也就是text进行的,这一点是week3逆向题的总体风格了,对text段操作,或者有shellcode

可以打开file -> script command 写入脚本进行解密的

image-20230222151457411

(ida的python接口的函数还不会写)

这样之后只要在0x14c6 p一下创建函数体就可以静态分析代码了

image-20230222151552310

加密很简单,异或之后输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
int main()
{
long long v9[6];
long long v10[6];
v9[0] = 0x5416D999808A28FALL;
v9[1] = 0x588505094953B563LL;
v9[2] = 0xCE8CF3A0DC669097LL;
v9[3] = 0x4C5CF3E854F44CBDLL;
v9[4] = 0xD144E49916678331LL;
v9[5] = 0x55BBD0DA616BAC;
v10[0] = 0x3B4FA2FCEDEB4F92LL;
v10[1] = 0x7E45A6C3B67EA16LL;
v10[2] = 0xAFE1ACC8BF12D0E7LL;
v10[3] = 0x132EC3B7269138CELL;
v10[4] = 0x8E2197EB7311E643LL;
v10[5] = 0x28C9B5AE540AC1;
for (int i = 0; i <= 46; i++) {
putchar(*((char*)v9 + i) ^ *((char*)v10 + i));
}
return 0;
}//hgame{You_4re_a_p@tch_master_0r_reverse_ma5ter}

看了眼大师傅们的解密脚本

都很妙,有用char对数组操作强制四位四位转换的

还有整个异或之后用python pwn库的p64函数转换成字符串的

都学到了新东西

week3的所有wp应该都齐了,复现完week3之后我发觉对于逆向来说,任何对内存进行的操作都要敏感,不论是对数据的修改还是对代码的修改,这都非常重要

ps:期末考考完哩,应该挂不了

2023.3.14更新 XCTF babyre

一道有趣的题目

image-20230314185701868

进去之后看到是这样的代码逻辑

judge数组的出现显得非常没有逻辑

其实这题和上文hgame的patchme是一个道理

都用了类似于smc技术

对关键代码进行了处理,不过hgame的逻辑隐藏地更深

1
2
3
4
5
6
7
import idc

addr=0x600b00

for i in range(182):

​ idc.patch_byte(addr+i,idc.get_wide_byte(i+addr)^12)##execute script

image-20230314190024215

judge代码逻辑

1
2
3
flag="fmcd"+chr(127)+"k7d;V`;np"
for i in range(len(flag)):
print(chr(ord(flag[i])^i),end='')##flag{n1c3_j0b}

如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !