逆向工程实验——lab8(C/C++反逆向Java字节码反逆向)

Posted 大灬白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆向工程实验——lab8(C/C++反逆向Java字节码反逆向)相关的知识,希望对你有一定的参考价值。

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.

  1. Wintel机器代码反逆向

活动描述:

将报告第6节和第7节中介绍的消除符号信息和模糊程序的反反转技术应用到密码库应用程序的C/ C++源代码中,目的是使禁用试用限制更加困难。使用Windows GNU编译器集合从修改过的源代码重新生成Password Vault应用程序的可执行二进制文件。显示Wintel机器代码反转和修补练习不能再进行演示。

这次的密码库应用程序是实验四-java反编译那一节的程序用C/ C++写的,先打开PasswordVaultObfuscated.exe应用程序运行,添加5条账户密码记录之后,程序提示达到上限不能再添加记录了:
在这里插入图片描述

我们的目标就是突破5条账户密码记录的限制。
先用IDA打开,查看字符串窗口:
在这里插入图片描述
在这里插入图片描述

发现除了标题以及部分提示的字符串,关键的字符串都已经被AES256算法加密了:

标题的提示文字

找到输出标题的提示文字的代码,有两处调用了这个提示函数:
在这里插入图片描述

之前运行过exe你就会知道,第一次调用是启动的时候最开始的提示,第二次调用是每次选择显示、创建、编辑、删除等功能都会先调用输出标题的提示文字。
找到第二次调用的位置在函数sub_4078B6()中:
在这里插入图片描述

6个功能的提示文字

下一个函数sub_401C04()就是输出6个功能的提示文字的函数:
在这里插入图片描述

在OD中给找到00401C04函数下断点,运行程序在显示完标题提示之后就会停在断点处:
在这里插入图片描述

这里就是显示6个功能的函数开始的地方,其中sub_401F42就是获取都是AES256解密后的字符串,sub_550C68就是printf函数,在00401D36 call Password.00527664下断点,运行程序就会断在输出第二个功能的提示文字之后:
在这里插入图片描述

00401C04函数就是负责输出6个功能的函数选项的提示文字,他们都包含在sub_4078B6()函数里:
在这里插入图片描述

我们再往上找到调用sub_4078B6()的sub_407504函数:
在这里插入图片描述

就可以发现功能实现的逻辑了,通过sub_4078B6()的返回1-6来跳转到6个不同的功能,其中控制添加账户密码记录的就是第二个功能sub_407CE6()。

功能2:添加记录

在OD中进入407CE6函数,往下我们可以找到一个判断跳转的地方,在00407D41下一个断点,输入数字2之后运行程序就会停在00407D41:
在这里插入图片描述

这时候我们已经输入了5条账户密码记录,然后al的值是01,ZF标志位是0,跳转不成立,这个跳转就是用来跳过
00407D5F E9 36080000 jmp Password.0040859A; 跳转到返回retn
让程序返回退出的,继续运行之后就会跳转到返回:
在这里插入图片描述

而跳转不成立则会 JMP到返回的位置
所以我们在这把ZF标志位改为1,就可以让跳转成立:
在这里插入图片描述

运行,成功突破限制可以继续添加账户密码记录:
在这里插入图片描述

所以这个判断就是账户密码记录条数是否小于5的关键位置,如果小于于5就可以继续添加账户密码记录,如果不小于5就输出[Error]返回。

我们再重新打开一个没有账户密码记录的exe,下断点在

00407D3F . 84C0 test al,al

运行停在断点00407D3F处:
在这里插入图片描述

这时候al的值为0,ZF的值为1,跳转成立,可以继续运行添加账户密码记录。

方法一:修改跳转

我们只需要保证跳转一直成立,这样就不会提前返回了。所以我们可以把je(等于0则跳转)修改成jmp(一直跳转),也就是把对应的机器码74改成EB,修改之前的代码如下图:
在这里插入图片描述

修改之后的代码:
在这里插入图片描述

复制到可执行文件,保存文件为 PasswordVaultObfuscated_crack_jmp.exe:
在这里插入图片描述

运行PasswordVaultObfuscated_crack_jmp.exe,成功突破限制:
在这里插入图片描述

方法二:修改返回值

因为test al,al在al为0时,al&al=0,ZF标志位置1;
je在ZF为1时跳转。
所以我们只需要让al始终为0即可实现一直添加账户密码记录,我们找到了返回eax的值位置:
在这里插入图片描述

然后我们将

00407A5B |. 0FB6C0 movzx eax,al;

修改成如下4种对应的机器码和对应的汇编:

编号机器码汇编是否合适
133C0xor eax,eax将eax置0,且运算速度比2快,且包含了movzx eax,al将eax除al以外的位置0的作用
2B8 00000000mov eax,0x0将eax置0,但是长度太长,修改比较麻烦
332C0xor al,al将al置0,且运算速度比2快
4B0 00mov al,0x0将al置0

第一种修改方式

第一种修改的既可以满足我们将al置0的目的,同时包含了源代码movzx eax,al将eax除al以外的位置0的作用,而且对CPU而言它的运算速度比mov eax,0x0快。
所以我们将源代码修改为33 C0 90,多的这一位一定要用90(nop)来代替,如果是00会被识别为代码影响后面的代码:
在这里插入图片描述

修改之后的代码:
在这里插入图片描述

复制修改到可执行文件,保存文件为PasswordVaultObfuscated_crack.exe,运行程序,成功突破限制:
在这里插入图片描述

第三种修改方式

但实际上,在这里我们按照其他的修改方式也可以实现我们的目的,可能是因为在这个程序中,eax除了al以外的位是不是为0对程序没有太大的影响 ,例如按照第三种修改32C0 xor al,al把源代码修改为32 C0 90:
在这里插入图片描述

复制修改到可执行文件,保存文件为PasswordVaultObfuscated_crack3.exe,运行程序,也可以成功突破限制:
在这里插入图片描述

第四种修改方式

例如第四种也是可以的B0 00 mov al,0x0,把源代码修改为B0 00 90:
在这里插入图片描述

复制修改到可执行文件,保存文件为PasswordVaultObfuscated_crack4.exe,运行程序,也可以成功突破限制:
在这里插入图片描述

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)

Java字节码反逆向 活动描述: 使用Java字节码反反转工具,如ProGuard,
SandMark,和CafeBabe在Java版本的密码库应用程序中应用反反转技术消除符号信息和混淆程序,目的是使其更难禁用试用限制。而不是试图实现一个自定义的控制流混淆抑制静态和动态分析在解决Wintel机器码反逆向运动,应用一个或多个控制流陷阱中可用SandMark并观察其影响通过反编译混淆使用Jad字节码。说明Java字节码反转和修补练习的解决方案不能再像演示的那样进行。
练习所需的软件: 密码库Java Windows安装程序 ProGuard (java字节码混淆器) RetroGuard
(java字节码混淆器) SandMark (java字节码混淆器) CafeBabe(java字节码编辑器)

(1)、将PasswordVault.jar加入ProGuard作为输入文件

在这里插入图片描述

(2)、然后你的得在下面添加文件所依赖的jar包,不然运行的时侯会报错:

在这里插入图片描述

添加 javax.crypto所需要的jar包:jce.jar
在这里插入图片描述

(3)、新建一个输出文件HYH.jar

在这里插入图片描述

之后就是一些参数的配置,例如要混淆哪些类和函数:
在这里插入图片描述

3. Format-String Server Vulnerability Lab

Task 7
http://www.cis.syr.edu/~wedu/seed/Labs_16.04/Software/Format_String_Server/
新链接:https://seedsecuritylabs.org/Labs_16.04/Software/Format_String_Server/
Overview

The learning objective of this lab is for students to gain the
first-hand experience on format-string vulnerability by putting what
they have learned about the vulnerability from class into actions. The
format-string vulnerability is caused by code like printf(user_input),
where the contents of variable of user_input is provided by users.
When this program is running with privileges (e.g., Set-UID program),
this printf statement becomes dangerous, because it can lead to one of
the following consequences: (1) crash the program, (2) read from an
arbitrary memory place, and (3) modify the values of in an arbitrary
memory place. The last consequence is very dangerous because it can
allow users to modify internal variables of a privileged program, and
thus change the behavior of the program. In this lab, students will
be given a program with a format-string vulnerability; their task is
to develop a scheme to exploit the vulnerability. In addition to the
attacks, students will be guided to walk through a protection scheme
that can be used to defeat this type of attacks. Students need to
evaluate whether the scheme work or not and explain why. Lab Tasks
(Description) VM version: This lab has been tested on our pre-built
SEEDUbuntu16.04 VM. Recommended Time Supervised situation (e.g. a
closely-guided lab session): 3 hours Unsupervised situation (e.g.
take-home project): 1 week Last Update (New) The lab was last updated
on January 12, 2020. Instructors now need to specify the value for a
constant. This will make it difficult for students to reuse the
solutions from the past. Videos (New) This topic is covered in my
Udemy course: Computer Security: A Hands-on Approach. Files that are
Needed The vulnerable server program: server.c A sample Python code
on how to construct strings: build_string.py The skeleton exploit
code (sample shellcode is included): exploit.py

本实验室的学习目标是让学生将课堂上对格式-字符串漏洞的了解转化为操作,从而获得关于格式-字符串漏洞的第一手经验。格式字符串漏洞是由printf(user_input)等代码引起的,其中user_input变量的内容是由用户提供的。当这个程序以特权运行(例如,Set-UID程序)时,这个printf语句变得危险,因为它可能导致以下后果之一:(1)程序崩溃,(2)从任意内存位置读取,(3)修改任意内存位置的值。最后一个结果是非常危险的,因为它允许用户修改特权程序的内部变量,从而改变程序的行为。

在这个实验中,学生将得到一个带有格式字符串漏洞的程序;他们的任务是开发一个方案来利用漏洞。除了攻击,学生将被指导通过一个保护方案,可以用来击败这类攻击。学生需要评估计划是否可行,并解释原因。
需要的文件 易受攻击的服务器程序:server.c 关于如何构造字符串的示例Python代码:build_string.py
框架攻击代码(包括示例shellcode): exploit.py

本实验室的DUMMY SIZE值为:100
为了简化本实验中的任务,我们使用以下命令关闭地址随机化:
$ sudo sysctl -w kernel.randomize_va_space=0
在这里插入图片描述

Task 1
给定一个具有格式字符串漏洞的易受攻击的程序server.c。这个程序是一个服务器程序。当它运行时,它监听UDP端口9090。每当UDP数据包到达这个端口,程序得到数据并调用myprintf()来打印数据。服务器是一个根守护进程,也就是说,它与根特权。在myprintf()函数内部,存在一个格式字符串漏洞。我们将利用这一点获取根权限的漏洞。

编译server.c。编译上述程序。您将收到一条警告消息。此警告消息是 gcc编译器针对格式字符串漏洞实现的对策。我们现在可以忽略这个警告消息:
// Note: N should be replaced by the value set by the instructor
$ gcc -DDUMMY_SIZE=N -z execstack -o server server.c
server.c: In function ’myprintf’:
server.c:13:5: warning: format not a string literal and no format arguments
[-Wformat-security]
printf(msg);

需要注意的是,程序需要使用"-z execstack"选项进行编译,该选项允许堆栈是可执行的。这个选项对任务1到5没有影响,但是对于任务6和7,它很重要。在这两个任务中,我们需要将恶意代码注入服
务器程序的堆栈空间;如果堆栈不是可执行的,任务6和7将失败。非可执行堆栈是针对基于堆栈的代码注入攻击的对策,但可以使用返回到 libc 技术来击败它。为了简化这个实验室,我们只需关闭这个可破解的对策。

4.阅读

在几周前微软三月星期二补丁日1 修复的119个CVE2 漏洞中,有29个漏洞来自我们报告的Uniscribe库的字体处理代码
https://bbs.pediy.com/thread-217331.htm

以上是关于逆向工程实验——lab8(C/C++反逆向Java字节码反逆向)的主要内容,如果未能解决你的问题,请参考以下文章

20155210 实验一 逆向与Bof基础

计算机系统 实验三 逆向工程实验

C/C++程序逆向-IDA切换到Ghidra说明

C/C++程序逆向-IDA切换到Ghidra说明

逆向程序分析:Windows的main(),启动函数分析

20171113曾英特《逆向及Bof基础实践》实验报告