Wgpsec CTF——Re部分wp

一、ezConfuse

先查壳,32位无壳

 直接拖进ida,这里出现了一个问题,在本机里,直接把这个文件拖进ida,ida会崩溃,但是用xp虚拟机里的ida就没问题,不清楚这里是什么原因

进来找到main函数,这里夹杂了几条无用指令,让ida分析失败了

直接把call $+5那三条指令nop掉就可以

这里修复好之后,发现摁f5还是没反应,那就只能硬看了

先判断输入字符串的长度是否是16位

 在向下,找到了加密函数和检验函数,先看加密函数

 

 加密函数和main函数一样,也是加了无用的call指令,直接nop掉,重新p一下就可以了

一个简单的累加算法

然后再看检验函数

也没有什么亮点,

直接写脚本跑出来

#include<iostream>
#include<windows.h>
#include<stdio.h>
using namespace std;

int main()
{ 
    int a2[] = {2,3,3,3};
    DWORD l3[4] = {0xd3ba857,0x36c8aa8a,0x6d8a126d,0x17bc4d16};
    DWORD v6 = 0xd3ba857;
      DWORD v5 = 0x36c8aa8a;
      DWORD v4 = 0x48d159c0;
    for (int i = 0; i < 0x40; ++i )
    {
        v5 -= (*(DWORD *)(a2 + ((v4 >> 11) & 3)) + v4) ^ (v6 + ((v6 >> 5) ^ 16 * v6));
        v4 -= 19088743;
        v6 -= (*(DWORD *)(a2 + (v4 & 3)) + v4) ^ (v5 + ((v5 >> 5) ^ 16 * v5));    
    }
    printf("%x\n%x\n",v5,v6);
    v6 = 0x6d8a126d;
    v5 = 0x17bc4d16;
    v4 = 0x48d159c0;
    for (int i = 0; i < 0x40; ++i )
    {
        v5 -= (*(DWORD *)(a2 + ((v4 >> 11) & 3)) + v4) ^ (v6 + ((v6 >> 5) ^ 16 * v6));
        v4 -= 19088743;
        v6 -= (*(DWORD *)(a2 + (v4 & 3)) + v4) ^ (v5 + ((v5 >> 5) ^ 16 * v5));    
    }
    printf("%x\n%x\n",v5,v6);
    return 0;
}

 

# 3340657b
# 67616c66
# 7d36645f
# 30635f5a
l = [0x66,0x6c,0x61,0x67,0x7b,0x65,0x40,0x33,0x5a,0x5f,0x63,0x30,0x5f,0x64,0x36,0x7d]
for i in l:
    print(chr(i),end='')

 二、easyRe

先查壳,发现是ASPACK壳,之前的文章有讲过ASPACK怎么脱,可以去看之前的文章,这个题的ASPACK很简单,一次esp定律法就可以了,这里不在演示

 

 脱完壳的程序直接拖进ida

 

 要输入用户名的密码,并且分别校验,校验放到了switch里,switch的执行顺序放到了数组里

 

下面是每个函数的作用

 

 

关键部分在检验用户名和密码处

 

 跟进这个函数

 

 用户名可以直接通过异或得到

 

 passwd部分是tea加密之后的结果,直接把v5tea解密即可

给出python脚本

 

def fun1(source,y):
    source[y+1] += y
    source[y] -= y
def fun2(source,y):
    source[y+3] = (y ^ source[y+3])
    source[y+2] = (y ^ source[y+2])
def fun3(source,y):
    source[y+2] = (source[y+2] - 4 * y)
    source[y+1] = (source[y+1] + 2 * y)
def fun4(source,y):
    source[y+2] = (source[y+2] - 5 * y)
    source[y] ^= (y+2)
l1 = [100, 108, 97, 103, 121, 56, 88, 41, 123, 92, 109, 123, 122,12,-25,33,107,68,-51,116,82,-15,33,123,-105,42,13,122,-97,31,100,97]
i = 28
for j in range(0,8):
    fun4(l1,i)
    fun3(l1,i)
    fun2(l1,i)
    fun1(l1,i)
    i -= 4
print(l1)
for i in l1:
    print(chr(i&0x7f),end='')
#Wgpsec

 

posted @ 2022-11-20 23:01  写在风中的信  阅读(288)  评论(0)    收藏  举报