BUU-CrackRTF
BUU-CrackRTF这道题太离谱了,很多没有见过的API,看不懂。
先查壳,发现是无壳的32位,丢进IDA,找到主函数
先输入了一段6个字符的字符串,再连上“@DBApp”,再进行加密,看一下加密函数
CryptCreateHash哈希加密,有了解过哈希的是可以知道,哈希是很多算法放在一起,然后随机抽一个算法来加密,这个0x8004u是什么看不懂,去查了一下winAPI文档才知道这个代表SHA1加密。
加密后与6E32D0943418C2C33385BC35A1470250DD8923A9对比,正确的话再进行。从前面的v4<100000发现有范围限制,到1000000就可以了
12345678910import hashlibs = '6E32D0943418C2C33385BC35A1470250DD8923A9'.lower()for i in range(100000,1000000): a = str(i)+'@DBApp' m = hashlib.sha1() m.update(a.encode( ...
逆向分析Hello World!程序
1.Hello World!程序这个程序想必大家都是非常熟悉的,第一个接触的程序一个就是他了,这里就不多加解释,用Visual C++编写
123456789101112#include "windows.h"#include "tchar.h"int _tmain(int argc, TCHAR *argv[]){ MessageBox(NULL, L"Hello World!", L"www.reversecore.com", MB_OK); return 0;}
2.调试Hello World.exe程序调试目的通过调试Hello World.exe可执行文件,在转换得到的汇编语言中找到main()函数。
开始调试首先用OllyDbg调试工具打开Hello World.exe程序
入口点调试器停止的地方即为Hello World.exe执行的初始地址,它是一段EP(入口)代码,最重要的就是call 和jmp两个指令。call指令的作用是调用 ...
大小端存储
一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。这个其实讽刺当时英国和法国之间持续的冲突。Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。
二、什么是大端和小端大端和小端是指数据在内存中的存储模式,它由 CPU 决定:
大端模式(Big-endian)是指将数据的低位(比如 1234 中的 34 就是低位)放在内 ...
BUU-luck_guy
GXYCTF2019 luck_guy拿到文件,先file一下,是64位的文件,直接拖进IDA64里面,找到主函数
可以看到patch_me是关键的函数,输入的flag都要放到里面去
继续跟进get_flag
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950unsigned __int64 get_flag(){ unsigned int v0; // eax int i; // [rsp+4h] [rbp-3Ch] int j; // [rsp+8h] [rbp-38h] __int64 s; // [rsp+10h] [rbp-30h] BYREF char v5; // [rsp+18h] [rbp-28h] unsigned __int64 v6; // [rsp+38h] [rbp-8h] v6 = __readfsqword(0x28u); v0 = time(0LL); srand(v0); for ( i ...
花指令
原理花指令是,由设计者特别构思,希望使反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向。经典的是,目标位置是另一条指令的中间,这样在反汇编的时候便会出现混乱。花指令有可能利用各种指令:jmp, call, ret的一些堆栈技巧,位置运算,等等。
花指令的作用是对付静态分析,以下面一段程序说明一下花指令的原理
123456789101112131415#include <iostream.h>#include <windows.h>void main(){ _asm { jmp l2 _EMIT 0x1//这里就是花指令 _EMIT 0x2//这里就是花指令 _EMIT 0x3//这里就是花指令 _EMIT 0x4//这里就是花指令l2: mov eax,0x11111111 }}
可以看到,程序直接跳转到标签l2了,在jmp指令和l2之间的就是花指令,花指令为什么能起作用呢?那是因为反编译器 ...