Python 字节码
前言做DASCTF X GFCTF2022十月挑战赛逆向的时候第一次遇到反编译py字节码
趁热打铁学习一下
Py字节码Python 的字节码是一种类似汇编指令的中间语言,一个 Python 语句会对应若干字节码指令,虚拟机一条一条执行字节码指令,从而完成程序执行。
Python 的 dis 模块支持对 Python 代码进行反汇编, 生成字节码指令。
如何查看python的字节码方法一:
1234567import dis def main(): hello(); print("Hello, World!") dis.dis(main)
方法二:
12345import dis s=open('hello.py').read()co=compile(s,'hello.py','exec')dis.dis(co)
py字节码的结构1源码行号 | 指令在函数中的偏移 | 指令符号 | 指令参数 | 实际参数值
详解变量1.CONSTLOAD_CONST 加载const变量,比如数值、字符串等,一般用于传给 ...
逆向学习笔记——花指令
0x00 花指令概念花指令是企图隐藏掉不想被逆向工程的代码块(或其它功能)的一种方法,在真实代码中插入一些垃圾代码的同时还保证原有程序的正确执行,而程序无法很好地反编译, 难以理解程序内容,达到混淆视听的效果。简单的说就是在代码中混入一些垃圾数据阻碍你的静态分析。
0x01 花指令分类可执行花指令1.可执行花指令指的是这部分花指令代码在程序的正常执行过程中会被执行,但执行这些代码没有任何意义,执行前后不改变任何寄存器的值(当然eip这种除外),同时这部分代码也会被反汇编器正常识别。2.首先,花指令的首要目的依然是加大静态分析的难度,让你难以识别代码的真正意图;然后,这种花指令可以破坏反编译的分析,使得栈指针在反编译引擎中出现异常。(当然我们知道栈指针实际上是没有问题的,只不过反编译引擎还有待完善的空间)
不可执行式花指令
花指令虽然被插入到了正常代码的中间,但是并不意味着它一定会得到执行,这类花指令通常形式为在代码中出现了类似数据的代码,或者IDA反汇编后为jmupout(xxxxx)。
这类花指令一般不属于CPU可以识别的操作码,那么就需要在上面用跳转跳过这些花指令才能保证程序的正常 ...
混淆
0x00 前言讲道理,从接触Re到现在快一年了,看了不少比赛的逆向题目,还是只接触到了一点皮毛,没有找到逆向工程真正的方向,学的很杂又很迷茫。
一开始想学re单纯是因为招新赛的时候没人写这个方向,然后接触到了第一个Re师傅X06,感觉人很有意思,所以开始走这个方向,emmm,我做事情的理由确实都奇奇怪怪。
空闲时间也问过X06师傅走逆向工程的方向,提到了混淆代码这个东西,于是来浅学一下,做一个学习笔记。
代码混淆及其作用代码混淆,是指将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。不仅仅是保护代码,它也有精简编译后程序大小的作用。
代码混淆不能阻止逆向工程但是会加大其难度,因为被混淆的代码反编译后难于理解,调试以及除错都变得困难。
常用方式有将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成”__”这样的符号,使得阅读的人无法根据名字猜测其用途。重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。打乱代码的格 ...
DASCTFxCBCTF2022九月挑战赛Re赛后复现
0x00 前言花指令花指令又称脏字节,英文为”junkcode”,顾名思义,即在程序中加入的一些垃圾指令,其目的是在不妨碍原有程序执行的前提下,阻碍程序反编译,增加静态分析难度,隐匿不想被逆向分析的代码块,混淆代码,绕过特征识别。
花指令总结_Captain_RB的博客-CSDN博客_花指令
C++异常处理C++异常处理源码与安全性分析_ashimida@的博客-CSDN博客_eh_frame段
try-catch如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。
catch(c++异常处理)_百度百科
12345678try{//程序中抛出异常 throw value;}catch(valuetype v){//例外处理程序段}
0x01 landing查壳 64位无壳PE文件
IDA反编译一下主函数
找到关键函数func1
分析一下可知func1函数给出了一段base6 ...
2022第五空间网络安全初赛Re赛后复现
0x00 前言所需工具: 开源逆向工具 Ghidra
下载地址(爱盘 - 最新的在线破解工具包)
0x01 re2常规查壳 64位无壳ELF二进制文件
尝试丢IDA反编译但是失败了 提示问题尚不清楚什么原因
改用Ghidra
顺利反编译出关键函数伪代码
main函数
move函数
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950undefined8 move(void){ char cVar1; int local_230; int local_22c; char local_228 [528]; undefined *local_18; local_18 = &_mips_gp0_value; local_22c = 0; local_228[0] = '\0'; local_228[1] = 0; memset(local_228 + 2,0,0x1fe); printf(&qu ...
第五届美团网络安全高校挑战赛Re赛后复现wp
0x00 前言学习大佬WP后的自己复现
首先解释一下IDA的两个功能
C指令
把当前的数据按照代码(code)的形式来显示
D指令
把当前的数据用数据(data)的形式来显示
0x01 small拿到附件Die查个壳 64位无壳ELF二进制文件
丢IDA
在IDA View界面地址处按C转换汇编代码
分析一下汇编代码
关键 add , mov , xor
可以看到一开始 add 了一个 67452301h
下面又 add 了四个较小的数
猜测可能是TEA加密的delta和4个key
然后在IDA view界面按D 找到密文 (暂时没想通为什么秘文是good后面的字符)
然后进行TEA解密
大佬脚本如下
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778#include <stdio.h>#include <stdi ...
NEUQCSA 2022 Reverse
TEA看题目以为是TEA加密
查壳 :64位无壳exe程序
扔到64位IDA里面 找到main函数F5反编译出伪代码
分析一下主函数:
用户先输入一个字符串后经过加密最后与encoude_flag 进行比较
查看一下这个encode_flag字符串
在字符串列表界面看更直观一点
像flag吗 像的
试着交一下,就是flag
Maze一看题目名字maze知道是迷宫题
那么题目描述中的wasd自然就是移动方式
老规矩查个壳
64位无壳exe程序
丢IDA反编译
主函数伪代码如下
123456789101112131415161718192021222324252627282930313233343536373839404142int __cdecl __noreturn main(int argc, const char **argv, const char **envp){ char v3; // [rsp+27h] [rbp-9h] BYREF int v4; // [rsp+28h] [rbp-8h] int v5; // [rsp+2Ch] ...
攻防世界刷题wp
ReReversing-x64Elf-100查壳,64位无壳文件
丢进64位的IDA pro查看到main函数后反编译出伪代码
查看判断函数
根据判断函数编写解密脚本
123456flag_s = ['Dufhbmf','pG`imos','ewUglpt']flag = ''for i in range (12): s = chr(ord(flag_s[i%3][2*(int(i/3))])-1) flag += s print(flag)
hackme查壳 ,64位无壳ELF文件
丢进IDA找main函数
没有main 函数,shift + f12 查看一下字符串列表
看到可疑的字符串 “ Give me the password: ”
双击点开,查看引用到这个字符串的函数
F5 反编译 查看关键函数的伪代码
2022国赛Re(部分)
0x00 前言是真的坐牢,真的阴间题目
0x01 baby_tree题目附件为一大段非代码格式的文字
由附件的后缀名 .ast 结合题目名字可以知道是 AST抽象语法树
阴间解法(硬看)推一下大佬写的wp,tql:2022国赛Re1 baby_tree_Hofiy的博客-CSDN博客
第一步由文件开头的“re.swift”可以发现这是由 swift 编写的程序
大佬博客中放了一段英文资料片段
我这边直接翻译一下,大致内容如下:
Swift编译器有一个有趣的模式:-dump-ast,它输出Swift源代码的抽象语法树
AST用于以包含语法信息的树的形式表示源代码
得知本题的考点是swift的ast 语法
第二步最为阴间的来了
大佬开始逐行分析附件,六百多行的代码
化作人形IDA反编译源代码,tqltqltql
恕我学艺不精,暂时还做不到
1.找到密文在附件的527行附近找到了密文,发现了比对的痕迹
2.逐行分析大佬反编译完的加密流程如下:
1234567891011121314def check(data,key): b=data k=key for i in r ...
ISCC2022 writeup
ReverseGetTheTable
下载附件,查个壳
64位程序无加壳
用IDA打开,反编译一下查看主函数伪代码
将str字符串拉去base58解码即可得到flag
Amy’s Code
下载附件,打开提示我们输入flag
先用PEID查个壳
可以看到是用C语言写的32位exe文件,没有加壳
将附件丢进IDA反编译
f5查看伪代码
源代码如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182int __cdecl main_0(int argc, const char **argv, const char **envp){ char Destination[520]; // [esp+DCh] [ebp-410h] BYREF char Source[516]; // [esp+2E4h] [ebp ...