逆向工程实验_lab1(Pyhon逆向)

1、tuts 4 you论坛注册

去下面这个论坛注册一个账号。
https://forum.tuts4you.com/
回答出security check问题就可以。
This is a security check to prevent automated programs from creating accounts.

刚开始第一次注册的时候我直接输好账号密码和其他信息就点创建账户了,没有觉得那个二维码是道题,如果是QQ或者微信的二维码可能就直接扫了,但因为是国外网站的二维码当时没有扫码的想法,所以就在答案的输入框里随便输入了几个数字,后来它提示我挑战失败,再来一次,我才意识到要扫码解题。
一扫,它是一堆的数字。我觉得他应该就是8进制文件,数字都是0~7,应该就是八进制文件:127 150 141 164 040 156 165 155 142 145 162 054 040 141 040 157 156 145 040 146 157 154 154 157 167 145 144 040 142 171 040 061 060 060 040 172 145 162 157 163 054 040 167 141 163 040 146 151 162 163 164 040 165 163 145 144 040 142 171 040 156 151 156 145 055 171 145 141 162 055 157 154 144 040 115 151 154 164 157 156 040 123 151 162 157 164 164 141 040 151 156 040 061 071 064 060 077。
用python脚本或者在线转换都行:
在这里插入图片描述

问题是:What number, a one followed by 100 zeros, was first used by nine-year-old Milton Sirotta in 1940?
百度了一下:数学家爱德华·卡斯纳(Edward Kasner)问他的侄子米尔顿·西罗塔(Milton Sirotta)(他当时9岁)为这个数字发明了一个名字,1后面写着一百个零,并且侄子选择了名字“googol”。
刚开始输入的答案是googol,竟然是错的!!!再百度了一下,发现没有问题啊,于是把它改成了大写:Googol。这次终于成功了。
在这里插入图片描述

邮件确认后就可以登陆了。
在这里插入图片描述
在这里插入图片描述

注册成功。

2、elfpass文件破解

把elfpass拷贝进seed虚拟机,设成root所有suid程序,用普通用户去攻击获得root权限。
可以先静态分析,搞不定再用gdb动态调试。

把elfpass用IDA打开,启用F5反编译:
在这里插入图片描述

获得源代码:

int __cdecl main(int argc, const char **argv, const char **envp)
{
    
    
  int result; // eax@4
  int v4; // edx@4
  char s1; // [sp+1Eh] [bp-7Ah]@1
  char s2[4]; // [sp+82h] [bp-16h]@1
  int v7; // [sp+90h] [bp-8h]@1

  v7 = *MK_FP(__GS__, 20);
  strcpy(s2, "unixvswindows");
  printf("Password: ");
  scanf("%64s", &s1);
  if ( !strcmp(&s1, s2) )
  {
    
    
    puts("Access granted..");
    setuid(0);
    execlp("id", "id", 0);
  }
  else
  {
    
    
    puts("Access denied..");
  }
  result = 0;
  v4 = *MK_FP(__GS__, 20) ^ v7;
  return result;
}

源代码需要我们输入密码,只要输入的密码等于“unixvswindows”,程序就会调用setuid(0);从而帮助我们获得root权限。

先给elfpass赋权限:
在这里插入图片描述

开始攻击,输入密码:
在这里插入图片描述

成功获得root权限。

3、逆向win.pyc

运行win.pyc,要求输出’You Win’代表成功。
先用软件反编译win.pyc。
在这里插入图片描述

得到它源代码:
在这里插入图片描述

用编译器打开:

# Embedded file name: d:/idf.py

def encrypt(key, seed, string):
    rst = []
    for v in string:
        rst.append((ord(v) + seed ^ ord(key[seed])) % 255)
        seed = (seed + 1) % len(key)

    return rst

if __name__ == '__main__':
    print("Welcome to idf's python crackme")
    flag = input('Enter the Flag: ')
    KEY1 = 'Maybe you are good at decryptint Byte Code, have a try!'
    KEY2 = [124,
     48,
     52,
     59,
     164,
     50,
     37,
     62,
     67,
     52,
     48,
     6,
     1,
     122,
     3,
     22,
     72,
     1,
     1,
     14,
     46,
     27,
     232]
    en_out = encrypt(KEY1, 5, flag)
    if KEY2 == en_out:
        print ('You Win')
    else:
        print ('Try Again !')

源代码就是一个输入字符串加密,当加密后的结果等于KEY2时输出“You win!”

那我们就需要反向破解密码。
但是破解过程中出现了问题,这是刚开始第一次的破解方法:
直接将算法反向解密:
在这里插入图片描述

破解出了正确字符串的8位256以内的ascii码,但是输入到win.py源代码中却失败了!

后来我思考了一下,ascii码在128~256中的字符是扩展ascii码,有些似乎是无法打印的。有可能是这导致了出错,我得找128以内的ascii码来代替。

于是有了接下来的第二种破解方法:
通过穷举,在128以内找到能够计算出正确KEY2的值:
在这里插入图片描述

将新的flag输入源代码win.py,结果正确,成功输出“You win!”
在这里插入图片描述

我再比较了来两次的字符串:
第一次:W°Ë½{Æ«ÔÊφ‹HµŽŽ’·}
第二次:WCTF{ILOVEPYTHONSOMUCH}
在256以内的ascii码中有些字符是无法打印的,而在128以内所有的字符都可以打印。
这是正确解密的源代码:

#KEY1的长度是55
KEY1 = 'Maybe you are good at decryptint Byte Code, have a try!'
#KEY2的长度是23
KEY2 = [124,48,52,59,164,50,37,62,67,52,48,6,1,122,3,22,72,1,1,14,46,27,232]
#KEY1字符串转换成int数组
key1 = []
for v in KEY1:
    key1.append(ord(v))

#结果字符串对应的ascii码数组
result = []
#k2
k2 = 0
#k1是key1的下标
for k1 in range(5,28):
    #查找128以内符合正确结果的ascii码
    for i in range(128):
        if KEY2[k2] == (i + k1 ^ key1[k1]) % 255:
            result.append(i)
    k2 = k2 + 1
flag = ""
for i in range(23):
    flag = flag + chr(result[i])
print("flag的值为:",flag)

运行win.pyc文件
在这里插入图片描述

4、cmpy2.exe逆向py

参考
Solving a PyInstaller-compiled crackme
https://hshrzd.wordpress.com/2018/01/26/solving-a-pyinstaller-compiled-crackme/
(上面链接的pyc版本较老,pyc头部缺少8个字节,而下面的cmpy2里面的pyc则缺12字节)
在windows操作系统下运行cmpy2.exe,要求输出’you are right!'代表成功。
第1步 - 解开exe
使用适当的工具可以轻松打开EXE包装。在这种情况下,我使用了用Python编写的PyInstallerExtractor。
在这里插入图片描述

第2步 - 反编译pyc
生成的输出存储在与输入可执行文件的名称对应的目录中。我们可以看到提取了多个模块,按照参考网站上的示例,我们找到了一个名为crackme2的文件:
在这里插入图片描述

crackme2是一个pyc删除了幻数的文件,因此我们可以从pyc我们在提取的集合中找到的其他文件中复制此部分,即
在这里插入图片描述

让我们将它粘贴在crackme2的开头:
在这里插入图片描述

在此步骤之后,我们准备将其保存为crackmw2.pyc和反编译:
可能因为解密工具Easy Python Decompiler解密的版本比较老,没有解密成功,所以我们选择在线解密。
在这里插入图片描述

我们看到了,cmpy2.exe文件的py源代码,之后便可以知道用户名和密码了。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Onlyone_1314/article/details/109036437