【绿城杯2021】babyvxworks wp

【绿城杯2021】babyvxworks wp

前述:

其实记录这个题主要是要提醒自己三分逆向七分猜的道理,不要死扣……

打开通过字符串查找去找到main函数

发现无法生成伪代码,查看发现是花指令的原因,然后还有函数的尾部地址识别不正确的问题

image-20240711012003666

其实一般来说这个地方的0XE8是作为call指令的机械码不会呗显示出来的,但是这个地方被IDA识别了就减轻了一定程序的工作量了

选择将E8填充为90或者直接nop掉,下面的也是一样的,然后再按c选择转换为指令形式

然后发现还是无法生成伪代码

原因:下图中可以看到push后还有call的调用,很明显函数没有结束但是这个地方IDA却显示为函数sub_3D9 的末尾,所以我们需要选择将这个错误的识别给去掉,在IDA菜单栏Edit里面找到functions,选择delete functions,然后其他的也是一样的

image-20240711012310144

最后再再函数第一个retn处创建函数末尾,Edit-functions-set function end

然后再回到未正确识别的函数开头p创建函数开头或者直接对着代码块F5即可正确创建伪代码

image-20240711012849280

如下:

image-20240711014732943

image-20240711014800588

看着挺头痛的其实直接追踪input即可

中间那一坨我们猜测是在对文件进行读取或其他操作

sub_34C0函数其实是在对Input进行长度的获取,即可以重命名为strlen

image-20240711014937397

然后我们观察do循环中v1和v38的赋值只有loc_330不同,后面为比较

所以猜测loc_330为加密函数

进入后发现只有一个异或操作和加法操作,循环次数为长度

image-20240711015243807

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h> 
#include<string.h>
int main(void)
{
int i,j;
int key[]=
{

188, 10, 187, 193, 213, 134, 127, 10, 201, 185, 81, 78,
136, 10, 130, 185, 49, 141, 10, 253, 201, 199, 127, 185,
17, 78, 185, 232, 141, 87
};

for (i=0;i<30;i++)
{
for(j=0;j<30;j++)
{
key[i]-=3;
key[i]^=0x22;
}
printf("%c",key[i]);
}
return 0;
}

flag{helo_w0rld_W3lcome_70_R3}


【绿城杯2021】babyvxworks wp
http://example.com/2024/07/11/【绿城杯2021】babyvxworks/
作者
John Doe
发布于
2024年7月11日
许可协议