findKey
findKey知识点
WIndows逆向
解题查壳,32位无壳。
打开程序,没发现什么
IDA打开,看可疑字符串发现flag{}
跳到该位置,发现爆红,两行一样的代码,nop掉第二行,按P生成函数,再F5反汇编。看到如下代码,已去除无关代码
LRESULT __stdcall sub_401640(HWND hWndParent, UINT Msg, WPARAM wParam, LPARAM lParam){ LoadStringA(hInstance, 0x6Au, Buffer, 100); v11 = Msg; if ( Msg > 0x111 ) { if ( v11 == 517 ) { if ( strlen((const char *)String1) > 6 ) ExitProcess(0); if ( strlen((const char *)String1) ) { memset(v20, 0, sizeof(v20)); ...
常见hash算法
hash加密算法逆向中常常出现一些加密算法,如果我们能对这些加密算法进行快速识别则会大大减少我们逆向的难度,虽然IDA已有密码分析神器Findcrypt,但掌握手动分析方法能帮助我们应对更多的情况。
以下文章大部分来自《加密与解密》段刚著。
前言做逆向一遇到复杂的加密就不会了,还没能系统的学习密码学吧,之后准备看看《深入浅出密码学》,这里汇总一下 各类加密算法吧加上逆向的例子便于理解。
hash的前奏Hash存储 Hash存储的意思是:对用户输入的密码按照Hash算法得到Hash值,然后将Hash值存到数据库中。 为什么说是 “Hash存储”,而不是 “加密存储”?因为这本来就不算是加密解密的过程,而且很容易对人造成误解。Hash算法是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。
转换算法目前主流的就是哈希算法,也叫译摘要算法,是一种散列算法。哈希算法是不可逆的,这里的不可逆有两层含义,一是“给定一个哈希结果R,没有方法将R转换成原目标文本S”,二是“给定哈希结果R,即使知道一段文本S的哈希 ...
[RoarCTF2019]polyre
[RoarCTF2019]polyre知识点
控制流平坦化
CRC加密
在IDA中运行python
main用IDA打开查看主函数,发现是多重While需要对代码进行控制流平坦化,可以参考下面的文章
利用符号执行去除控制流平坦化
OLLVM混淆,使用工具defalt.py去混淆
python deflat.py -f /home/phantomor/Desktop/polyre –addr 0x400620(去混淆函数地址)
查看运行出的新程序,
__int64 __fastcall main(int a1, char **a2, char **a3){ signed __int64 v4; // [rsp+1E0h] [rbp-110h] int i; // [rsp+1E8h] [rbp-108h] int v6; // [rsp+1ECh] [rbp-104h] int v7; // [rsp+1ECh] [rbp-104h] char s1[48]; // [rsp+1F0h] [rbp-100h] BYREF char s[60]; // [rsp ...
格式化字符串漏洞
格式化字符串漏洞printf函数输入流程 :
函数首先会获取第一个参数,也就是格式化字符串,依次读取格式化字符串的每一个字符,如果是%,则继续读取下一个空字符,获取对应的参数解析并输出,如果该字符不为%,则直接输出到标准输出.
printf("My name is %s,I'm %d years old\n","otto",19)
c语言printf格式化字符串的基本格式如下:
parameter可以忽略n$,或者用来获取格式化字符串的指定参数例如int a=0x11,b=0x22,c=0x33;printf("%3$p",a,b,c);//output: 0x33flagfield width输出的最小宽度precision输出的最大长度length,输出的长度hh,输出一个字节h,输出一个双字节typed/i,有符号整数u,无符号整数x/X,16 进制 unsigned int 。x 使用小写字母;X 使用大写字母。如果指定了精度,则输出的数字不足时在左侧补 0。默认精度为 1。精度为 0 且值为 0,则输出为空 ...
栈溢出和ROP
gets_plt = 0x08048460# .plt:08048460 ; [00000006 BYTES: COLLAPSED FUNCTION _gets. PRESS CTRL-NUMPAD+ TO EXPAND]system_plt = 0x08048490# .plt:08048490 ; [00000006 BYTES: COLLAPSED FUNCTION _system. PRESS CTRL-NUMPAD+ TO EXPAND]pop_ebx = 0x0804843d# pop ebxbuf2 = 0x804a080payload = flat( ['a' * 112, gets_plt, pop_ebx, buf2, system_plt, 0xdeadbeef, buf2])
栈溢出和ROP栈:一种先进后出的数据结构。常见操作有两种,进栈(PUSH) 和弹栈(POP),用于标识栈的属性有两个,一个是栈顶(TOP),一个是栈底(BASE)
程序中的栈:
...
PwnTools学习
PwnTools学习做题发现好多方法不知道,得系统的看看Pwntools
持续更新……
连接本地用process(),远程用remote()。
IO模块recv,send
send(data) # 发送数据sendline(data) # 发送一行数据,相当于在末尾加\nrecv(numd=4096,timeout=default) # 给出接收字节数,timeout指定超时recvuntil(delims, drop=False) # 接收到delims的patternrecvline(keepends=True) # 接收到\n,keepends指定保留\nrecvall() # 接收到EOFrecvrepeat(timeout=default) # 接收到EOF或timeoutinteractive() # 与shell交互
ELF模块ELF模块用于获取ELF文件的信息,首先使用ELF()获取这个文件的句柄,然后使用这个句柄调用函数,和IO模块很相似。
下面演示了:获取基地址、获取函数地址(基于符号)、获取函数got地址、获取函数plt地址
>>> e = E ...
Angr介绍
Angr介绍
angr 来源于CGC项目,最初用于自动攻防。
平台无关(platform-agnostic)的二进制分析框架
( Computer Security Lab ) UCSB,Shellphish
Angr可以干什么?
Disassembly and intermediate-representation lifting
Program instrumentation(程序检测)
符号执行
Control-flow analysis/控制流分析
Data-dependency analysis
Value-set analysis (VSA)
使用angrop自动构建ROP链
使用patcherex自动进行二进制强化
使用rex自动生成漏洞利用程序(用于DECREE和简单的Linux二进制程序)
使用angr-management(一个angr的GUI)来分析二进制程序
符号执行
在执行程序时用符号代替真实值。符号执行的优点在于,当使用真实值执行程序路径只有一条,而使用符号执行时,由于符号可变,我们可以利用这一特性,尽可能将程序的每一条路径遍历,这样的话,必定存在至少 ...
花指令
花指令花指令是企图隐藏掉不想被逆向工程的代码块(或其它功能)的一种方法。
重点:构造永恒跳转,添加垃圾数据!
文本字符串某字符串不想被逆向工程的时候,可能会试图隐藏掉该字符串,让IDA或者其他十六进制编辑器无法找到
下面介绍怎么去构造这样的字符串的实现方式:
mov byte ptr [ebx], ’h’mov byte ptr [ebx+1], ’e’mov byte ptr [ebx+2], ’l’mov byte ptr [ebx+3], ’l’mov byte ptr [ebx+4], ’o’mov byte ptr [ebx+5], ’ ’mov byte ptr [ebx+6], ’w’mov byte ptr [ebx+7], ’o’mov byte ptr [ebx+8], ’r’mov byte ptr [ebx+9], ’l’mov byte ptr [ebx+10], ’d’
当两个字符串进行比较的时候看起来是这样:
mov ebx, offset usernamecmp byte ptr [ebx], ’j’jnz failcmp byte ptr [ebx+ ...
栈指针平衡
栈指针平衡当我们在静态分析时,想用F5查看伪代码是,结构会出现一个warring
positive sp value has been found
每条语句前的栈指针是这条语句未执行的栈指针。我们在IDA中使用Ait+K就可以修改栈指针
为什么会产生栈指针不平衡呢?这可能就是IDA的一个漏洞吧,但是又无可避免。在IDA官网上有这么一段解释:
IDA有栈跟踪的功能,它在函数内部遇到ret(retn)指令时会做判断:栈指针的值在函数的开头/结尾是否一致,如果不一致就会在函数的结尾标注”sp-analysis failed”。一般编程中,不同的函数调用约定(如stdcall&_cdcel call)可能会出现这种情况;另外,为了实现代码保护而加入代码混淆(特指用push/push+ret实现函数调用)技术也会出现这种情况。
SMC
SMCSMC(Self-Modifying Code)(自解码),可以在一段代码执行前对它进行修改。常常利用这个特性,把代码以加密的形式保存在可自行文件中,然后在程序执行的时候进行动态解析。这样我们在采用静态分析时,看到的都是加密的内容,从而阻断了静态调试的可能性。SMC的执行流程如下:
对SMC有个大致的理解,为了更好的理解这种反静态调试手段
SMC自解码,可以针对部分代码进行加密,在运行到这段代码时,就对该段代码解密。 当我们遇到这样的题目就可以采取静态分析与动态分析结合的方式
MOV混淆MOV这种混淆是怎样产生的呢?剑桥大学的Stephen Dolan证明了x86的mov指令可以完成几乎所有功能了(可能还需要jmp),其他指令都是“多余的”。受此启发,有个大牛做了一个虚拟机加密编译器。它是一个修改版的LCC编译器,输入是C语言代码,输出的obj里面直接包含了虚拟机加密后的代码。如它的名字,函数的所有代码只有mov指令,没有其他任何指令。这个加密编译器在网上是开源的项目。这里是这个编译器开源项目的地址,有兴趣的小伙伴可以配置来玩玩。https://github.com/xorea ...