suctf逆向部分
自己真的菜,然后在网上找了一篇分析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逆向部分的更多相关文章
- 【腾讯Bugly干货分享】移动App入侵与逆向破解技术-iOS篇
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e0acc896e9ebb6865f321 如果您有耐心看完这篇文章,您将懂 ...
- [.NET逆向] 破解NET的四大神器
原本这篇文章可以更早一星期写出来与大家分享,由于某方面的原因耽搁到现在,心里竟有那么一点好像对不住大家的感觉.这当然与神器有关,因为我发现利用这四大神器我似乎觉得几乎所有的NET程序破解都不在话下了 ...
- iOS-Block总结 && 全面解析逆向传值
1.block的特点: block是C语言: block是一种数据类型.可以当做参数,也可以用做返回值:--总之,对比int的用法用即可(当然,定义的时候,最好跟函数对比): ...
- Reverse Core 第一部分 代码逆向技术基础
@date: 2016/10/14 <逆向工程核心原理>笔记 记录书中较重要的知识,方便回顾 ps. 因有一些逆向基础,所以我本来就比较熟悉的知识并未详细记录 第一章 关于逆向工程 目标, ...
- 【DWR系列02】-DWR逆向Ajax即服务器推送
.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...
- php正则逆向引用与子模式分析
先看一个例子: <?php $string = 'April 15, 2003'; $pattern = '/(\w+) (\d+), (\d+)/i'; $replacement = '${1 ...
- 【逆向篇】分析一段简单的ShellCode——从TEB到函数地址获取
其实分在逆向篇不太合适,因为并没有逆向什么程序. 在http://www.exploit-db.com/exploits/28996/上看到这么一段最简单的ShellCode,其中的技术也是比较常见的 ...
- 浅谈Android应用保护(一):Android应用逆向的基本方法
对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...
- iOS程序逆向Mac下常用工具——Reveal、HopperDisassemble、IDA
原文在此 一.Reveal 1 一般使用 Reveal是ITTY BITTY发布的UI分析工具,可以很直观的查看App的UI布局.如下图所示: Reveal是需要付费的,需要89美元, ...
随机推荐
- Confluence 6 开始编辑 CSS
希望编辑空间的样式表: 进入到空间,然后在左侧边栏中选择 空间工具 > 界面外观(Space tools > Look and Feel). 选择 样式表(Stylesheet)然后选择 ...
- 声明寄存器ROM
:] ROM [:] ; integer i; initial begin ;i<=;i=i+) begin ROM[i] <= {{'b0}}; end end 同时可以考虑双端口ROM ...
- Nginx详解八:Nginx基础篇之Nginx请求限制的配置语法与原理
Nginx的请求限制: 连接频率的限制:limit_conn_module 配置语法:limit_conn_zone key zone=name:size;默认状态:-配置方法:http 配置语法:l ...
- WBXML 1.3协议摘要
协议地址:WAP195 网络字节顺序:big-endian. 为什么要加0x40? 参考:Compressing XML When an element contains content (t ...
- Flask-WTF中的csrf保护
CSRF 保护 这部分文档介绍了 CSRF 保护. 为什么需要 CSRF? Flask-WTF 表单保护你免受 CSRF 威胁,你不需要有任何担心.尽管如此,如果你有不包含表单的视图,那么它们仍需要保 ...
- VS2017+mysql5.7 连接数据库生成实体
参考:https://www.cnblogs.com/RushPasser/p/5438334.html 下载:https://share.weiyun.com/5rM4FrG mysql-for-v ...
- TensorFlow框架(一) 张量、计算图、会话
参考:中国大学MOOC 北京大学 曹健<TensorFlow笔记> 基于TensorFlow的NN:用张量表示数据,用计算图搭建神经网络,用会话执行计算图,优化线上的权重(参数),得到模型 ...
- signal() 和 sigaction()
[摘自<Linux/Unix系统编程手册>] Unix系统提供了两种方式来改变信号处置:signal() 和 sigaction(). signal() 的行为在不同Unix实现间存在差异 ...
- MVC5干货篇,目录和路由
MVC目录结构概述 文件夹或文件 描述 备注 /App_Data 此文件夹用于存放私有数据,如XML,或者SQL Server Express\SQLite的数据库文件,或其他基于文件的存储库 IIS ...
- 分布式一致性算法——paxos
一.什么是paxos算法 Paxos 算法是分布式一致性算法用来解决一个分布式系统如何就某个值(决议)达成一致的问题. 人们在理解paxos算法是会遇到一些困境,那么接下来,我们带着以下几个问题来学习 ...