Monthly Archives: November 2017

TaintDroid 动态污点分析工具部署

TaintDroid是一款著名的Android动态污点分析工具。我的安装环境是ubuntu 16.04 x64 安装 JDK 6u45 TaintDroid仅支持jdk6及以下的版本,如果有装高版本的jdk的话,需要进行替换 cd ~/Downloads proxychains wget http://85-207-0-21.static.bluetone.cz/java/1.6.0_45/jdk-6u45-linux-x64.bin sudo mkdir -p /usr/local/java cd /usr/local/java sudo cp ~/Downloads/jdk-6u45-linux-x64.bin . sudo chmod +x jdk-6u45-linux-x64.bin 我之前是解压jdk8到/usr/local底下,然后将路径添加到~/.zshrc里,因此我自己还得将这里的添加环境变量的几行代码注释掉。 sudo vim /etc/profile … JAVA_HOME=/usr/local/java/jdk1.6.0_45 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin export JAVA_HOME export PATH 然后配置JDK和JRE的位置 sudo update-alternatives … Continue reading

Posted in android | Leave a comment

UPX 3.07 (Unpacking + DLL + Overlay)

Upx作为入门级的简单压缩壳,脱壳方法其实很简单。这里主要介绍的是使用ImportREC手动脱壳以及Dll脱壳。 ImportREC手动脱壳 我们常用的ImportREC脱壳是使用的软件自带的IAT auto search,但是如果我们要手动查找IAT的地址并dump出来,又该怎么操作呢? 首先使用ESP定律,可以很快地跳转到OEP: 00401110。 我们右键点击,选择查找->所有模块间的调用 显示出调用的函数列表,我们双击其中的某个函数(注意这里要双击的应该是程序的函数而不是系统函数) 我们来到了函数调用处 右键点击跟随,进入函数 然后再右键点击数据窗口中跟随->内存地址 这里因为显示是十六进制值,不方便查看,我们可以在数据窗口点击右键选择长型->地址,就可以显示函数名 注意我们要向上翻到IAT表的起始位置,可以看到最开始的函数地址是004050D8的kernel.AddAtomA, 我们向下找到最后一个函数,也就是user32.MessageBoxA函数,计算一下整个IAT表的大小。在OD的最下方有显示块大小:0x7C,所以我们整个IAT块大小就是0x7C 打开ImportREC,选择我们正在调试的这个程序,然后分别输入OEP:1110, RVA:50D8, SIZE:7C,然后点击获取输入表 这里在输入表窗口中右键选择高级命令->选择代码块。 然后会弹出窗口,选择完整转储,保存为dump.exe文件 dump完成后,选择转储到文件,这里选择修复我们刚刚dump出的dump.exe,得到一个dump_.exe。这时整个脱壳就完成了 DLL脱壳 为什么要谈到上面的ImportREC手动脱壳呢?因为Dll脱壳需要这一步骤。Dll脱壳的最关键的步骤在于LordPE修改其Dll的标志,用LordPE打开UnpackMe.dll,然后在特征值那里点击…,然后取消勾选DLL标志,保存后,那么系统就会将该文件视作一个可执行文件。 我们将UnpackMe.dll后缀名改成UnpackMe.exe,然后用OD载入。 一般在入口点,程序都会保存一些信息,这里就很简单,只作了一个cmp。要注意的一点是,这里的jnz跳转直接就跳到了Unpack的末尾,因此我们需要修改寄存器的z标志来使得跳转失效。同时在unpack的末尾设下一个断点以避免脱壳完直接运行。 Dll脱壳的基本步骤跟exe文件脱壳一样,只是要注意,在脱壳完dump后,要记得用LordPE把DLL标志恢复过来。

Posted in unpack | Leave a comment

!EP(EXE Pack)v1.2 unpack

典型的ESP定律脱壳+ImportREC修复导入表,PEiD的查壳结果是AHpack 0.1 -> FEUERRADER ESP定律脱壳 OD载入程序,第一行汇编指令就是popad,因此采用ESP定律脱壳。 我们F8运行popad这条指令,然后对ESP寄存器右键选择HW break[ESP]设下断点然后运行 然后运行程序 我们继续向下运行,执行到RETN返回,我们可以发现我们就到达了OEP(0x000271B0) 然后选中这些OD没能正确识别的汇编码,然后右键选择[分析]->[从模块中删除分析]。就可以看到OEP正确代码 我们再继续右键,选择[用OllyDump脱壳调试进程],然后选择确定,保存为dump文件后,我们可以运行,发现程序无法正常运行,因此我们需要修复dump文件。这里要使用ImportREC来修复函数的导入表 打开ImportREC,我们首先在最上方选择“活动进程”为我们正在用OD调试的这个程序,然后在右侧的OEP中填入我们找到的OEP: 0x271B0(注意0x00400000是程序的载入基址,不是OEP) 选择“自动查找IAT”完成后继续选择获取输入表,我们就能看到ImportREC找到了IAT中各导入函数的地址。 最后,我们选择“转储到文件”,然后选择我们之前用OllyDump导出的dump文件,确定后,ImportREC就会生成一个修复好的文件dump_.exe 我们运行dump_.exe就可以发现程序已经正常运行了。脱壳也就完整结束

Posted in unpack | Leave a comment

SWPU cm50 and cm100

cm50 题目下载链接: cm50.zip .net程序用dnspy打开,其实就是一个拨打电话的程序。输入电话号码,然后点击“拨打”键就可以打电话。 用dnspy打开后,关键逻辑在于“拨打”的点击事件里。 首先验证电话号码长度是否为5, 然后再将电话号码逐位跟4异或并与contrast数组比较。由于异或的传递性,我们可以直接拿contrast跟4异或就好了。这里可以得到08067 之后的flag跟输入的电话号码没有关系,而是直接xor1和xor2和4异或得到,结果是greet_08067 xor1 = [86,65,83,85,76,111,6,15,6,0,1] xor2 = [53,55,50,52,60,52,50,51,50,50,50] contrast = [52,60,52,50,51] phoneNum = “” flag = “” for i in range(0,5): contrast[i] ^= 4 phoneNum += chr(contrast[i]) print phoneNum for j in range(0,11): flag … Continue reading

Posted in writeups | Leave a comment

HCTF level1

程序检测了OD,IDA的进程名,也有用IsDebuggerPresent和ntdll!NtQueryInformationProcess来检查调试器 大部分的分析工作都是用IDA静态分析,因为很久没做逆向了,因此光是分析就花了很长时间,写脚本也花了不少时间。因此感觉一般。 题目下载链接: Evr_Q_a1bad588324e19cda44e20fd8cb291b5a735470ef4736f7969aa30fe4ec10ac3.zip import string enc_flag = [0x1E, 0x15, 0x2, 0x10, 0x0D, 0x48, 0x48, 0x6F, 0xDD, 0xDD, 0x48, 0x64, 0x63, 0xD7, 0x2E, 0x2C, 0xFE, 0x6A, 0x6D, 0x2A, 0xF2, 0x6F, 0x9A, 0x4D, 0x8B, 0x4B, 0xCF, 0xBF, 0x4F, 0x47, 0x4E, 0x13, … Continue reading

Posted in writeups | Leave a comment