自己真的菜,然后在网上找了一篇分析pyc反编译后的文件然后进行手撸opcode,过程真痛苦

http://www.wooy0ung.me/writeup/2017/10/11/0ctf-quals-2017-py/
   names ('ctypes', 'libnum', 'n2s', 's2n', 'binascii', 'b', 'key', 'aaaa', 'aa', 'aaaaa', 'aaa', 'aaaaaa', '__name__')从这我们看到程序的大概函数和变量
   ctypes libnum n2s s2n binascii  b key aaaa aa aaaaa aaa aaaaaa  __name__

查找了一下发现 ctypes 是python 访问c 的库

连接http://python3-cookbook.readthedocs.io/zh_CN/latest/c15/p01_access_ccode_using_ctypes.html

libnum 类似 用法参考以下链接

http://www.cnblogs.com/pcat/p/7225782.html

google 了一下发现这个

Very Hard RSA

http://bestwing.me/2016/09/10/Common%20types%20of%20RSA/

基本还原前四个的代码了

import ctypes

from libnum import n2s,s2n

至于binasciipython内置模块我这里不做阐述

然后就是 b key aaaa aa aaaaa aaa aaaaaa  '__name__'

开始猜测大概函数是这样

import ctypes

from libnum import n2s,s2n

def b():
     ...

def key():
     ...

def aaaa():
     ...

def aa():
     ...

def aaaaa():
     ...

def aaa():
     ...

def aaaaaa():
     ...

def main():
     ...

if '__name__==main()'
     main()

但是再回去分析发现导出都在传key所以key几乎不可能是一个函数而且b只在a.py处出现了一次,推测b可能是一个局部变量

现在有如下结构

import ctypes

from libnum import n2s,s2n

def aaaa():
     ...

def aa():
     ...

def aaaaa():
     ...

def aaa():
     ...

def aaaaaa():
     ...

def main():
     ...

if '__name__==main()'
     main()

这时候我们通过 names vernames和name 进行还原

import ctypes

from libnum import n2s,s2n

def aaaa():
     a=lambda a:b.hexhexlify(a)
    

def aa():
     a=cdll.LoadLibrary('./a') #https://blog.csdn.net/linda1000/article/details/12623527

def aaaaa():
     s2n(a)

def aaa():
     a=cdll.LoadLibrary('./a')

def aaaaaa():
     aaa(aaaa(key))

def main():
     aaaaaa()

if '__name__==main()'
     main()

发现似乎含有bug,使得freevars段还没使用,怎么办呢google http://kdr2.com/tech/main/1012-pyc-format.html

发现这是嵌套函数使用的,好了们明白了

import ctypes

from libnum import n2s,s2n

key=***

def aaaa(key):
     a=lambda a:b.hexhexlify(a)
     return ''.join(a[i] for i in key)

def aa(key):
     a=cdll.LoadLibrary('./a') #https://blog.csdn.net/linda1000/article/details/12623527
     a(key)

def aaaaa(a):
     s2n(a)

def aaa(key):
     a=cdll.LoadLibrary('./a')
     a(key)

def aaaaaa():
     aaa(aaaa(key))

def main():
     aaaaaa()

if '__name__==main()'
     main()

程序逻辑到这里差不多清晰了,但是b还有点模糊猜测是import模块引起的,于是在修改

import ctypes

from libnum import n2s,s2n

import binascii as b

key=***

def aaaa(key):
     a=lambda a:b.hexhexlify(a)
     return ''.join(a[i] for i in key)

def aa(key):
     a=cdll.LoadLibrary('./a') #https://blog.csdn.net/linda1000/article/details/12623527
     a(key)

def aaaaa(a):
     s2n(a)

def aaa(key):
     a=cdll.LoadLibrary('./a')
     a(key)

def aaaaaa():
     aaa(aaaa(key))

def main():
     aaaaaa()

if '__name__==main()'
     main()

这里基本就复现完成,下面我们在进行解密即可,参考大牛的技术进行后面的解密即可

void decrypt(char *k){
     FILE *fp1, *fp2;
     unsigned char key[256] = {0x00};
     unsigned char sbox[256] = {0x00};
     fp1 = fopen("code.txt","r");
     fp2 = fopen("decode.txt","w");
     DataEncrypt(k, key, sbox, fp1, fp2);

}

extern "C" 

{   
    void a(char *k){
        encrypt(k);
    }
    void aa(char *k){
        decrypt(k);
    }

}

解密时python调用c函数进行解密

from ctypes import *

from libnum import n2s,s2n

import binascii as b

#key="20182018"

def aaaa(key):
     a=lambda a:b.hexlify(a)
     return "".join(a(i) for i in key)

def aa(key): #jia mi
     a=cdll.LoadLibrary("./a").a
     a(key)

def aaaaa(a):
     return s2n(a)

def aaa(key): #jie mi
     a=cdll.LoadLibrary("./a").aa
     a(key)

def brup_key():
     i=20182000
     while i<100000000:
         aaa(aaaa(str(i)))
         data=open("flag.txt","r").read()
         if "SUCTF" in data:
             print i
             break
         i=i+1

def aaaaaa():
     # aa(aaaa(key))#jia mi
     # aaa(aaaa(key)) #jie mi
     brup_key()

if __name__=="__main__":
     aaaaaa()

key为20182018

参考文章安全客suctfwp链接:https://www.anquanke.com/post/id/146419

suctf逆向部分的更多相关文章

  1. 【腾讯Bugly干货分享】移动App入侵与逆向破解技术-iOS篇

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e0acc896e9ebb6865f321 如果您有耐心看完这篇文章,您将懂 ...

  2. [.NET逆向] 破解NET的四大神器

     原本这篇文章可以更早一星期写出来与大家分享,由于某方面的原因耽搁到现在,心里竟有那么一点好像对不住大家的感觉.这当然与神器有关,因为我发现利用这四大神器我似乎觉得几乎所有的NET程序破解都不在话下了 ...

  3. iOS-Block总结 && 全面解析逆向传值

    1.block的特点:      block是C语言:      block是一种数据类型.可以当做参数,也可以用做返回值:--总之,对比int的用法用即可(当然,定义的时候,最好跟函数对比):   ...

  4. Reverse Core 第一部分 代码逆向技术基础

    @date: 2016/10/14 <逆向工程核心原理>笔记 记录书中较重要的知识,方便回顾 ps. 因有一些逆向基础,所以我本来就比较熟悉的知识并未详细记录 第一章 关于逆向工程 目标, ...

  5. 【DWR系列02】-DWR逆向Ajax即服务器推送

    .literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...

  6. php正则逆向引用与子模式分析

    先看一个例子: <?php $string = 'April 15, 2003'; $pattern = '/(\w+) (\d+), (\d+)/i'; $replacement = '${1 ...

  7. 【逆向篇】分析一段简单的ShellCode——从TEB到函数地址获取

    其实分在逆向篇不太合适,因为并没有逆向什么程序. 在http://www.exploit-db.com/exploits/28996/上看到这么一段最简单的ShellCode,其中的技术也是比较常见的 ...

  8. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  9. iOS程序逆向Mac下常用工具——Reveal、HopperDisassemble、IDA

    原文在此 一.Reveal 1 一般使用     Reveal是ITTY BITTY发布的UI分析工具,可以很直观的查看App的UI布局.如下图所示:     Reveal是需要付费的,需要89美元, ...

随机推荐

  1. vue之$forceUpdate

    由于一些嵌套特别深的数据,导致数据更新了.UI没有更新(连深度监听都没有监听到) this.$forceUpdate();

  2. 洛谷 P3627 [APIO2009]抢掠计划

    这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...

  3. 封装input 逐渐,且input插件必须带有默认值。

    封装input 逐渐,且input插件必须带有默认值. 组件: <template> <div class="input-show"> <span c ...

  4. ruby安装sass和compass步骤

    依赖ruby,所以需要安装Ruby 如何安装Ruby呢?在windows下通过RubyInstaller来安装,安装过程中需要选择第二项 1.ruby -v 2.gem install sass (如 ...

  5. mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,

      在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记 ...

  6. IDEA项目找不到浏览器报错的情况

    调tomcat的时候,它会调用浏览器,浏览器关联如果有问题,肯定是会报错的  要是测试的时候,就是浏览器的问题,重新把浏览器装一遍让他自己重新关联一下应该就行了

  7. 使用tensorflow构造隐语义模型的推荐系统

    先创建一个reader.py,后面的程序将用到其中的函数. from __future__ import absolute_import, division, print_function impor ...

  8. 纯css3实现的switch开关按钮

    效果如图 <p> <label><input class="mui-switch mui-switch-anim" type="checkb ...

  9. Senparc.Weixin微信开发(1) 开发验证

    官方系列教程 http://www.cnblogs.com/szw/archive/2013/05/20/3089479.html 登录微信公众平台后-左侧找到开发--启用服务器配置 这样,我们才可以 ...

  10. Hadoop数据分析平台项目实战(基于CDH版本集群部署与安装)

    1.Hadoop的主要应用场景: a.数据分析平台. b.推荐系统. c.业务系统的底层存储系统. d.业务监控系统. 2.开发环境:Linux集群(Centos64位)+Window开发模式(win ...