F0rest's forest


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

以獬豸杯为例的PC仿真方案演示

发表于 2024-01-29

本文参照DFIR蘇小沐使用VMware进行仿真的文章而写

苦于没有傻瓜式仿真工具,遂有此文。

0x00 准备环境

  1. FTK 4.2.14

    1. 官网免费下载:https://www.exterro.com/digital-forensics-software/ftk-imager
    2. 注:笔者使用的是之前安装的旧版
  2. Virtualbox 7.0.14

    1. 下载地址:https://www.virtualbox.org/wiki/Downloads
  3. 目标镜像

    1. 下载地址:https://pan.baidu.com/s/1KYq_HkpPBHWCvWTzz6yzSw?pwd=xzcp
    2. 解压密码:都考100分

0x01 挂载镜像

点击“File”,选择”Image Mounting…”

image-20240129102819008

选择镜像路径后,我们必须将挂载方式设置为可写,然后点击“挂载”即可

image-20240129103048072

挂载后会显示该镜像各个磁盘驱动的信息

image-20240129103216730

注意。挂载后的物理硬盘符号为PhysicalDrive2,我们接下来要使用它。

0x02 将物理硬盘转化为虚拟硬盘

使用管理员权限打开cmd

image-20240129101141635

切换到virtualbox目录下

image-20240129100709672

.\VBoxManage.exe list hostdrives --long 查看各个硬盘的具体信息

image-20240129103423477

这里我们可以注意到一个点,系统镜像存在EFI分区,所以启动使用的是UEFI引导

映射物理硬盘为虚拟硬盘

1
2
3
4
5
VBoxManage createmedium disk --filename "F:\virtual_machine\hd1.vmdk" --format=VMDK --variant RawDisk --property RawDrive=\\.\PhysicalDrive2
# --filename 指定输出路径
# --format 指定输出文件格式,支持VDI | VMDK | VHD
# --variant 指定磁盘格式,RawDisk不生成的磁盘,而是直接指向宿主机上的物理磁盘分区或整个磁盘的一种访问方式。
# --property RawDrive 指定物理盘路径

image-20240129110312912

0x03 VirtualBox新建虚拟机

不指定虚拟光盘

image-20240129105007554

因为仿真对象为EFI引导,所以勾选EFI

image-20240129105119965

选择“使用已有的虚拟硬盘文件”

点击“完成”后,启动我们的虚拟机,稍作等待

image-20240129110516902

启动起来的样子如下图所示

image-20240129110606565

测试一下可用性,先解锁bitlocker分区(密码为Longxin@123),启动D:\hMailServer\Bin\hMailAdmin,输入密码900110

可以启动,大成功!

image-20240129110838271

0x04 移除虚拟磁盘&卸载磁盘

你可以选择删除所有文件来将虚拟机和磁盘文件一起删除,也可在介质管理(位于“管理”-“工具”-“虚拟介质管理”)中删除虚拟磁盘文件(先释放再删除)。

image-20240129112037465

在FTK Image中选中所有磁盘分区,点击取消挂载即可。

image-20240129111600190

报错处理

启动虚拟机时invalid partition table

invalid partition table就是出现了无效分区表,直接说就是硬盘分区或者引导出现问题,说明在新建虚拟机时引导选择错误。

2024獬豸杯WP

发表于 2024-01-29

附件: https://pan.baidu.com/s/1KYq_HkpPBHWCvWTzz6yzSw?pwd=xzcp
解压密码:都考100分

手机取证

使用网络泄露的Magnet AXIOM7.8 完成所有题目

手机基本信息

1、IOS手机备份包是什么时候开始备份的。(标准格式:2024-01-20.12:12:12)

就是解压后的文件夹名

image-20240128205228346

答案:20240115.14:19:44

2、请分析,该手机共下载了几款即时通讯工具。(标准格式:阿拉伯数字)

image-20240128205353733

在应用程序使用情况-”已安装应用“中即可看到

答案:3

3、手机机主的号码得ICCID是多少。(标准格式:阿拉伯数字)

image-20240128205601738

答案:89860320245121150689

4、手机机主登录小西米语音的日期是什么时候。(标准格式:20240120)

image-20240128205645951

答案:20240115

地图数据

5、请问嫌疑人家庭住址在哪个小区。(标准格式:松泽家园)

我以为这一题是社工,因为手机里有几张带有经纬度的图片,但定位也不是什么小区。

又以为是地图的截图的位置,结果也不是。

toto✌的wp里说是高德地图的搜索点:天铂华庭 。

其实我觉得这题不太好。

浏览器

1、Safari浏览器书签的对应数据库名称是什么。(标准格式:sqltie.db)

找到Safari的书签后点击“源”就自动调转到数据来源文件的位置

image-20240128205759155

image-20240128205853239

答案:Bookmarks.db

2、手机机主计划去哪里旅游。(标准格式:苏州)

image-20240128205932495

答案:拉萨

即时通讯

首先是通过手机的图片确定嫌疑人使用的通信软件

image-20240128210147414

排除陌陌和QQ之后就只能是那个小西语音了,接下来就是找软件聊天记录

1、手机机主查询过那个人的身份信息。(标准格式:龙信)

七找八找就翻到了聊天记录的数据库文件

image-20240128210523074

答案:龙黑

2、请问机主共转多少费用用于数据查询。(标准格式:1000)

image-20240128210553283

答案:1100

3、机主查询的信息中共有多少男性。(标准格式:阿拉伯数字)

手机里还有个手机短信发来的手机号身份证信息的图,根据身份证号倒数第二位即可判断性别,男性为奇数。

image-20240128210840751

需要注意的是前8个人身份证号都是全的,后面两个要么根据名字猜测一下要么瞎猜(

答案:4

其他有用信息

在取证比赛以及实践中,证据总是交叉的,这里记录一下我们在手机中发现的可能有用的东西

  1. 短信提示我们嫌疑人喜欢用生日做密码

image-20240128211137437

  1. 嫌疑人手机号为:+8617712681561
  2. 备忘录中记录了两条像密码的信息
    1. PCBL:Longxin@123
    2. 0110

计算机取证

感谢赛事组织方提供的取证大师

PS:当载入检材的时候就会提示有bitlocker加密分区,结合手机中的PCBL就能猜到密码是Longxin@123

基本信息

1、计算机系统的安装日期是什么时候。(标准格式:20240120)

image-20240128211618802

答案:20240112

系统痕迹

1、请问机主最近一次访问压缩包文件得到文件名称是什么。(标准格式:1.zip)

image-20240128220125462

答案:data.zip

数据库分析

1、还原数据库,请分析root用户最后一次更改密码的时间是什么时候。(标准格式:2024-01-20.12:12:12)

解锁Bitlocker之后挂载到本地,打开邮箱(\Program Files\Foxmail 7.2\Foxmail.exe)发现data.zip的压缩包密码

image-20240128220405478

爆破,启动!

image-20240128221755061

答案:15566666555

2、请问mysql数据库中共存在多少个数据库。(标准格式:阿拉伯数字)

image-20240128231856702

答案:5

3、员工编号为204200的员工总工资为多少元。(标准格式:阿拉伯数字)重建书库

image-20240128231204535

答案:488313

4、Finance部门中在1999年1月1日当天和之后入职的人员数量是多少名。(标准格式:阿拉伯数字)

根据team_list表显示,Finance部门对应的dept_no是d002

从hiredate中获取符合条件的雇员条目然后统计数量

image-20240128231822810

1
2
3
SELECT COUNT(*)
FROM `hiredate`
WHERE dept_no = 'd002' AND from_date >= '1999-01-01'

答案:1486

邮箱服务器

1、请问邮箱服务器的登录密码是多少。(标准格式:admin)

找到\hMailServer\Bin\hMailServer.INI,该文件记录了密码的MD5

image-20240128233648737

image-20240128233623494

答案:900110

2、邮件服务器中共有多少个账号。(标准格式:阿拉伯数字)

image-20240128232620315

答案:3

3、邮件服务器中共有多少个域名。(标准格式:阿拉伯数字)

感谢toto师傅指点迷津,我一开始还在研究重建呢。

“不是什么东西都能本机还原的”——toto

仿真起来之后,登录上服务器直接看就行

image-20240129005840420

答案:3

4、请问约定见面的地点在哪里。(标准格式:太阳路668号)

image-20240128222037855

根据邮件,街头地点在藏在图片中

答案:3

apk分析

基础题+一捏捏代码审计

使用JADX-GUI完成所有题目

1、APP包名是多少。(标准格式:com.xxx.xxx)

image-20240128201659167

答案:com.example.readeveryday

2、apk的主函数名是多少。(标准格式:comlongxin)

image-20240128201742843

答案:StartShow

3、apk的签名算法是什么。(标准格式:xxx)

image-20240128201922327

答案:SHA1withRSA

4、apk的应用版本是多少。(标准格式:1.2)

image-20240128201952113

答案:1.0

5、请判断该apk是否需要联网。(标准格式:是/否)

image-20240128202008242

答案:是

其实就证据而言只看到这里是不够的,结合T6也能知道。

6、APK回传地址?(标准格式:127.0.0.1:12345)

正则匹配即可,模式串为:[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:

image-20240128202241895

答案: 10.0.102.135:8888

7、APK回传数据文件名称是什么。(标准格式:1.txt)

顺着回传地址的代码就很容易找到以下内容,这是设置web请求头。

image-20240128202326704

答案:Readdata.zip

8、APK回传数据加密密码是多少。(标准格式:admin)

关键点就是找到文件如何生成的,容易想到搜索文件名Readdata.zip,EncryFile这个函数让人一眼看穿

image-20240128202513828

image-20240128202705913

答案:19_08.05r

9、APK发送回后台服务器的数据包含以下哪些内容?(多选)
A.手机通讯录B.手机短信C.相册D.GPS定位信息E.手机应用列表

看函数名就知道了

image-20240128202758945

答案:ABE

记MapnaCTF2024的两题PLC流量

发表于 2024-01-23

这是一篇赛后复现的文章,做题的时候犯了一些错误,仅作记录警醒自己。

Forensics/PLC I

The MAPNA CERT team has identified an intrusion into the plant’s PLCs, discovering a covert message transferred to the PLC. Can you uncover this secret message?
MAPNA CERT 团队发现了对工厂 PLC 的入侵,发现了传输到 PLC 的秘密消息。你能揭开这个秘密信息吗?

Files: PLC_0829b4ef9780677086043add8592e996f21e0bbe.txz

随手翻就能看到一些奇怪的,连续的,可读的字符串。

掏出神奇的string,你会得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
>>>strings plc.pcap              
4-"@
(-#@
>-$@
A-%@
/-&@
I-'@
/-(@
I-)@
/-*@
I-+@
/-,@
I--@
3:Ld_4lW4 <---
6ES7 151-8AB01-0AB0
/-.@
E-/@
/-0@
I-1@
/-2@
I-3@
IM151-8 PN/DP CPU
/-4@
5:3__PaAD <---
E-5@
/-6@
1:MAPNA{y <---
E-7@
/-8@
4:yS__CaR <---
O-9@
# !
/-:@
E-;@
/-<@
6:d1n9!!} <---
E-=@
Y3td
/->@
2:0U_sHOu <---
(-?@

善良的出题人还告诉了我们顺序!所以flag是MAPNA{y0U_sHOuLd_4lW4yS__CaR3__PaADd1n9!!}

Forensics/PLC Ⅱ

After extensive investigations, the MAPNA forensics team discovered that the attackers attempted to manipulate the PLC time. Please identify the precise time in the following format: year:month:day:hour:minute:second:millisecond. The flag is MAPNA{sha256(datetime)}.
经过广泛的调查,MACNA取证团队发现攻击者试图操纵PLC时间。请按以下格式标识精确时间:年:月:日:小时:分钟:秒:毫秒。标志为 MAPNA{sha256(datetime)}。

Files: PLC_0829b4ef9780677086043add8592e996f21e0bbe.txz

拿到流量包发现全部都是TCP流量,显然应该就提取data数据,然后分析具体是什么协议了。

题目的名字的为PLC,这意味着这是一道工控设备的流量题,通过第29条流量我们甚至可以直接发现设备的型号为:IM151-8 PN/DP CPU,这是西门子旗下的一款设备。

image-20240123104911593

循着这个思路下去就是分析这款设备如何修改时间,这里我走进了一个误区,去翻阅了这款cpu的手册找到了它”使用 PROFINET 进行时间同步”。仔细研究profinet这个协议之后我卡住了,因为它和TCP没有毛关系。

事实上这个是相对底层的东西,不是很重要。(这里我也问了LLM,它也把我往这方面去引导了T^T)我们需要知道的是:

  1. IM151-8是什么:西门子工业自动化领域的产品系列之一,属于西门子的S7-1500系列。
  2. 怎么使用它:STEP 7是用于编程、配置和维护SIMATIC S7控制器的软件工具。
  3. 工控软件的协议是什么:S7 协议是 SIEMENS S7系列产品之间通讯使用的标准协议

因此S7协议才是这里的流量真正归属的协议。

再介绍一下,来自sealldev的智慧,在他们的wp中他们截取了tcp.data起始部分03000016使用github的code search功能找到了相关的脚本,进而确定了协议

image-20240123112840406

wireshark wiki在S7comm中提到了设置时间的例子

在示例中我们可以找到设置时间(set time)的43号流量,并且关注到表示设置时间的特征数值:4702(如图所示,4代表请求,7代表时间函数,02代表设置时间的子函数)

image-20240123122837950

因此我们在题目附件plc.pcap的分组字节流中进行十六进制值的搜索即可。

以下是我的搜索结果:

image-20240123123238801

时间戳就是00202309211959599490,解析结果是2023:09:21:19:59:29:949,依照题目要求进行sha256即可。

附录

S7 Timestamp

以题目PLCⅡ中的00202309211959599490为例进行解析

位置 含义 示例
0x00 保留,一般为0x00 00
0x01 年1 20
0x02 年2 23
0x03 月 09
0x04 日 21
0x05 时 19
0x06 分 59
0x07 秒 59
0x08~0x0a 毫秒(逆序) 0949

相关阅读

  • krauq’s wp
  • seall’s wp
  • wirshark wiki-S7comm

小反思

  1. 对流量的特征进行搜索,最简单的方式就是截取数据头部
  2. 别太相信LLM,他们鬼话太多了。
  3. 匍匐在伟大的github code search之下吧!

IrisCTF2023题解

发表于 2024-01-10

这是我加入r3之后第一次有输出的比赛,比赛难度不大,有些题目挺有新意的,记录一下我参与解决的题目。

OSINT

Czech Where?

开局一张图,直接喂给谷歌图片搜索

image

能找到同一地点的图片,来自一篇游记http://tabiichigo.livedoor.biz/archives/51921024.html

图片链接为:https://livedoor.blogimg.jp/rokitomo/imgs/4/e/4eff76c9-s.jpg

地点为捷克黄金巷Zlatá ulička u Daliborky

这篇文章也可以佐证20号在黄金巷中,“黃金巷真的非常狹小,總長應該只有十來公尺,共有No.11到No.27十七間屋子”

试来试去终于出了,flag是irisctf{zlata_ulicka_u_daliborky}

好好好,捷克语是吧….

Network

Where’s skat?

这一题一开始我以为是直接分析报文中地理相关信息,于是先研究了流量包中各种协议,一些DNS协议或者DHCP协议中可以使用地域相关字段,而在本题中不存在。后来想使用IP进行定位,只能定位到山景城的IP(但后面也证明了不是那里)。

Anaïs Huang师傅提出使用无线网络的SSID,根据含义明确的SSID可以有效找到大致的位置,例如

Morlin <=> Morlin Engineering\Morlin Guest…

ABM Parking <=> ABM Parking Services

Mag1str师傅则使用wigle.net这个网站利用流量中的BSSID信息准确的位置Union Station

image-20240110170358033

而flag是irisctf{los_angeles_union_station}

另外再补充一些wlan相关知识:https://forum.huawei.com/enterprise/zh/thread/580899002067599360

Foresics

Not Just Media

使用potplayer播放该视频,在“属性”中的“媒体内嵌资源”项上我们可以发现怪东西

image-20240110171444649

选中后点击“保存为其他名称”即可提取出来

打开预览一下就会发现存在字符替换的情况

image-20240110171630936

那么就有以下几种思路了:

  1. 提取被替换的字符
  2. 提取替换上去的字符
  3. 以这个字体重新渲染某个特定的字幕。

这一题是第三者,使用这个字体重新渲染一下mkv文件中的字幕即可。

怎么渲染呢?在fontsee.com这个网站中上传字体后输入字幕的内容即可。

提取字幕也可以使用potplayer,入口在“字幕”->“保存字幕”->“另存字幕为”

image-20240110172138663

What the Beep?

我愿称之为物理题。

思路很开门,给了四个html文件,文件名就是经纬坐标,打开后就能看到横轴为时间纵轴为分贝的折线图。

经过观察,记录数据如下:

位置 声强 近似
源点 140dB 140dB
上37.310205, -120.352005 55.70~56.67dB 56dB
下37.185287, -120.292548 49.00~49.985dB 49.5
左37.258453, -120.406603 51.79~52.2dB 52dB
右37.232087, -120.262349 52.04~53dB 52dB

思路就是:利用声音衰减规律计算距离,利用四个坐标计算范围,求交点。但具体数值的计算是不便的,不如转换为比例。

声音衰减公式

由上述公式可以推出r上:r下:r左:r右 = 2.2:1:1.4:1.4

于是用ps模个图看看大致位置。

map

可能偏差有点大,试了好多次都不对,于是心一横写了个枚举程序。

PS:我自己设置的参数爆破了好一会都没出,Crazy_Man随手一改就出来了,TQL,ORZ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 左上角 37.280627, -120.325931

# 右下角 37.277058, -120.323865
from pwn import *
import time

context(log_level = 'debug',os = 'linux')

max_retries = 3
retry_delay = 5 # 重试间隔时间(秒)

for x in range(7300, 7400, 20):
for y in range(5300, 5900, 20):
connected = False
retries = 0

while not connected and retries < max_retries:
try:
p = remote("what-the-beep.chal.irisc.tf", "10500", timeout=10) # 设置连接超时时间为10秒
p.recvuntil("Input: ")
payload = f"37.2{x}, -120.32{y}"
p.sendline(payload.encode())
r = p.recv(1024)
connected = True
except Exception as e:
print(f"Connection error: {e}. Retrying in {retry_delay} seconds...")
retries += 1
time.sleep(retry_delay)
continue

if retries == max_retries:
print(f"Max retries reached for coordinates ({x}, {y})")
else:
p.close()
time.sleep(2)
if "Not" not in r.decode():
print(r.decode())
print("*"*20)
p.interactive()

Investigator Alligator

背景故事就是机器被打了,加密了一些文件,用户还输入了一些东西。

拿到的是磁盘镜像,用7z直接解压了。

检查用户目录

在用户目录\home\stephen下我们发现了被加密的文件encrypted.img、可执行文件taunt和python脚本rswenc.py

简单分析tauna就是提示被PWNED了,然后让输入一些内容;rswenc.py则是和指定的服务器进行交互然后利用得到的密钥加密指定文件。

根据题目描述,管理员记录了流量和内存镜像

思路就很清晰了,分析流量呗

检查管理员目录

在root目录下找到.bash_history,可以确定capture下的network是受攻击时tcpdump获得的流量,使用LiME获取了内存镜像,位置为\LiME\src\sample.mem。

分析

首先是流量分析,结合python脚本,我们筛选出ip.addr == 149.28.14.135 and tcp.port == 9281的流量,发现只有一条,并且数据也是明文传输的: eng0jieh7ahga7eidae6taebohhaicaeraef5ahng8ohb2Tho3ahz7ojooXeixoh0thoolung7eingietai8hiechar6ahchohn6uwah2Keid5phoil7Oovool3Quai

接下来就是编写脚本进行恢复被加密的数据了。

改改rswenc.py的ip和端口,再写个服务端发送密钥即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import socket

data = 'eng0jieh7ahga7eidae6taebohhaicaeraef5ahng8ohb2Tho3ahz7ojooXeixoh0thoolung7eingietai8hiechar6ahchohn6uwah2Keid5phoil7Oovool3Quai'
# 创建一个socket对象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置超时时间(可选)
sock.settimeout(10)
try:
# 连接到指定的IP和端口
sock.connect(('127.0.0.1', 4444))
# 发送数据
sock.sendall(data.encode())
finally:
# 关闭连接
sock.close()

恢复出的数据用7z打开找到data\super_duper_important_info.png

image-20240110191740554

这是一半的flag,另一半也很容易想到就是用户输入的内容咯。

十六进制查看器打开sample.mem很容易就能找到

mem

PS:在检查用户目录下的bash_history时会发现可疑文件.cache/gunzip/gunzip,这就是攻击者的🐎.

逆向任务下大模型的简单对比

发表于 2024-01-05

进行这个实验缘起于看到了宝玉xp分享的技术文章”OpenAI 官方提示工程指南 [译]“, 又想起了WPeace分享的ida插件”WPeChatGPT“
PS:我是穷逼所以目前使用都是免费的模型
PS:文章还没有写完,清华✌就推出了逆向大模型,可惜我没有申请~~>_<~~

约定

根据提示工程指南我设计的promot如下:

1
2
3
4
5
6
7
你需要扮演一位资深的软件逆向工程师并执行以下任务:
1.将汇编代码或字节码提升为高级语言如C++或C(如果给出的是伪代码则忽略该步骤)
2.根据1中提升出的代码或直接得到的代码在100字内归纳总结代码的功能
3.结合代码和代码的功能猜测代码可能的函数名和出自哪个库
其他说明:
1. 你需要分析的代码将使用“`”符号进行包裹,例如void a(int v1)....`
2. 理解任务后,请回答“明白"

选取的逆向代码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
请分析以下代码:
`.text:00000001400145B0 ; uintptr_t sub_1400145B0()
.text:00000001400145B0 sub_1400145B0 proc near
.text:00000001400145B0 var_18 = qword ptr -18h
.text:00000001400145B0
.text:00000001400145B0 sub rsp, 38h
.text:00000001400145B4 mov rax, 2B992DDFA232h
.text:00000001400145BE cmp cs:__security_cookie, rax
.text:00000001400145C5 jz short loc_1400145DA
.text:00000001400145C7 mov rax, cs:__security_cookie
.text:00000001400145CE not rax
.text:00000001400145D1 mov cs:qword_14001E080, rax
.text:00000001400145D8 jmp short loc_14001461F
.text:00000001400145DA
.text:00000001400145DA loc_1400145DA: ; CODE XREF: sub_1400145B0+15↑j
.text:00000001400145DA call sub_1400144C0
.text:00000001400145DF mov [rsp+38h+var_18], rax
.text:00000001400145E4 mov rax, 2B992DDFA232h
.text:00000001400145EE cmp [rsp+38h+var_18], rax
.text:00000001400145F3 jnz short loc_140014604
.text:00000001400145F5 mov rax, 2B992DDFA233h
.text:00000001400145FF mov [rsp+38h+var_18], rax
.text:0000000140014604
.text:0000000140014604 loc_140014604: ; CODE XREF: sub_1400145B0+43↑j
.text:0000000140014604 mov rax, [rsp+38h+var_18]
.text:0000000140014609 mov cs:__security_cookie, rax
.text:0000000140014610 mov rax, [rsp+38h+var_18]
.text:0000000140014615 not rax
.text:0000000140014618 mov cs:qword_14001E080, rax
.text:000000014001461F
.text:000000014001461F loc_14001461F:
.text:000000014001461F add rsp, 38h
.text:0000000140014623 retn`

本次评测参与的模型有:

模型 文心一言 通义千问 ChatGPT3.5
版本 2.5.2 2.1.1 text-davinci-002-render-sha

对比大模型的反编译能力

文心一言的表现

image-20231227202743069

通义千问的表现

image-20231227202836898

ChatGPT3.5的表现

image-20231227203058570

结果

首先,分析我们的任务要求。我们的任务要求包括三部分,一是对汇编代码的进行提升,二是总结代码功能,三是推测函数的来源,细节上我们还要求“用少于等于100字”进行归纳总结。

三个模型的完成情况如下(-表示没有识别到任务,0表示未完成,0.5表示完成的一般,1表示基本完成):

文心一言 通义千问 ChatGPT3.5
提升 - - 0
总结 1 1 1
推测 - 0.5 0.5
100字内 1 1 1

三个模型基本都能做到对代码的总结(虽然接近对汇编代码的逐行翻译了),也能控制字数在指定范围内,但两个国产模型没有识别到提升任务,此外文心一言还没有完成推测任务。可能由于信息缺失,导致推测任务对于大模型而言比较困难,所以我进行了补充信息的尝试,补充的信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
接下来我将补充关于函数sub_1400144C0的内容。补充完全后,你需要重新分析sub_1400145B0函数。
.text:1400144C0 sub_1400144C0 proc near
.text:1400144C0 push rdi
.text:1400144C2 sub rsp, 40h
.text:1400144C6 lea rax, [rsp+48h+SystemTimeAsFileTime]
.text:1400144CB mov rdi, rax
.text:1400144CE xor eax, eax
.text:1400144D0 mov ecx, 8
.text:1400144D5 rep stosb
.text:1400144D7 lea rcx, [rsp+48h+SystemTimeAsFileTime]
.text:1400144DC call cs:GetSystemTimeAsFileTime
.text:1400144E2 mov rax, qword ptr [rsp+48h+SystemTimeAsFileTime.dwLowDateTime]
.text:1400144E7 mov [rsp+48h+var_28], rax
.text:1400144EC call cs:GetCurrentThreadId
.text:1400144F2 mov eax, eax
.text:1400144F4 mov rcx, [rsp+48h+var_28]
.text:1400144F9 xor rcx, rax
.text:1400144FC mov rax, rcx
.text:1400144FF mov [rsp+48h+var_28], rax
.text:140014504 call cs:GetCurrentProcessId
.text:14001450A mov eax, eax
.text:14001450C mov rcx, [rsp+48h+var_28]
.text:140014511 xor rcx, rax
.text:140014514 mov rax, rcx
.text:140014517 mov [rsp+48h+var_28], rax
.text:14001451C lea rcx, [rsp+48h+PerformanceCount]
.text:140014521 call cs:QueryPerformanceCounter
.text:140014527 mov eax, dword ptr [rsp+48h+PerformanceCount]
.text:14001452B shl rax, 20h
.text:14001452F xor rax, qword ptr [rsp+48h+PerformanceCount]
.text:140014534 mov rcx, [rsp+48h+var_28]
.text:140014539 xor rcx, rax
.text:14001453C mov rax, rcx
.text:14001453F mov [rsp+48h+var_28], rax
.text:140014544 lea rax, [rsp+48h+var_28]
.text:140014549 mov rcx, [rsp+48h+var_28]
.text:14001454E xor rcx, rax
.text:140014551 mov rax, rcx
.text:140014554 mov [rsp+48h+var_28], rax
.text:140014559 mov rax, 0FFFFFFFFFFFFh
.text:140014563 mov rcx, [rsp+48h+var_28]
.text:140014568 and rcx, rax
.text:14001456B mov rax, rcx
.text:14001456E mov [rsp+48h+var_28], rax
.text:140014573 mov rax, [rsp+48h+var_28]
.text:140014578 add rsp, 40h
.text:14001457C pop rdi
.text:14001457D retn

囿于篇幅,不展示具体的结果仅作口头描述。

三个模型均首先提升了新补充的函数,并没有重新分析目标函数,总结功能上更加具体了一些,但仍不能推测函数的出处,需要指出的是ChatGPT的没有真正提升至高级语言。

对比不同大模型的推测分析能力

在本part中,我尝试直接提供ida pro反编译的结果给大模型,让他们重新分析,promot与上一个实验一致。

提供的反编译代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
unsigned __int64 sub_1400144C0()
{
unsigned __int64 v1; // [rsp+20h] [rbp-28h] BYREF
struct _FILETIME SystemTimeAsFileTime; // [rsp+28h] [rbp-20h] BYREF
LARGE_INTEGER PerformanceCount; // [rsp+30h] [rbp-18h] BYREF

memset(&SystemTimeAsFileTime, 0, sizeof(SystemTimeAsFileTime));
GetSystemTimeAsFileTime(&SystemTimeAsFileTime);
v1 = (unsigned __int64)SystemTimeAsFileTime;
v1 ^= GetCurrentThreadId();
v1 ^= GetCurrentProcessId();
QueryPerformanceCounter(&PerformanceCount);
return ((unsigned __int64)&v1 ^ PerformanceCount.QuadPart ^ ((unsigned __int64)PerformanceCount.LowPart << 32) ^ v1) & 0xFFFFFFFFFFFFi64;
}
uintptr_t sub_1400145B0()
{
uintptr_t result; // rax
unsigned __int64 v1; // [rsp+20h] [rbp-18h]

if ( _security_cookie == 0x2B992DDFA232i64 )
{
v1 = sub_1400144C0();
if ( v1 == 0x2B992DDFA232i64 )
v1 = 0x2B992DDFA233i64;
_security_cookie = v1;
result = ~v1;
qword_14001E080 = ~v1;
}
else
{
result = ~_security_cookie;
qword_14001E080 = ~_security_cookie;
}
return result;
}

文心一言的表现

image-20231227221124047

通义千问的表现

image-20231227221119523

ChatGPT3.5的表现

image-20231227222043631

结果

三个模型的完成情况如下(-表示没有识别到任务,0表示未完成,0.5表示完成的一般,1表示基本完成):

文心一言 通义千问 ChatGPT3.5
总结 1 0.5 1
推测 0 1 0.5

三个模型的表现各有亮点,文心一言和ChatGPT3.5都在总结中指出了函数用于防御缓冲区溢出;在预测部分中,通义千问给出了函数名(实际查询后发现给出的函数名是错误的,但有一定参考价值),而ChatGPT注意到了该函数和Windows相关。

以WPeChatGPT插件为例,对比不同提示的效果

通过阅读WPeChatGPT的源码,我将其逆向部分使用的Promot提取如下(原插件中还设计了漏洞分析和利用的promot)

1
2
3
下面是一个C语言伪代码函数,分别分析该函数的预期目的、参数的作用、详细功能,最后取一个新的函数名字。(用简体中文回答我,并且回答开始前加上'---GPT_START---'字符串结束后加上'---GPT_END---'字符串
结合该程序的函数调用结构及其所包含的字符串,猜测其运行目的及功能。
请再仔细分析后告诉我该程序的运行目的及大概功能。

这个提示包括两部分,第一部分是逐步分析,第二部分是总结(反复确认是为了减少错误)。

让我发送测试中的伪C代码,以下是Chat-GPT3.5 Turbo的响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# PART 1
---GPT_START---
这段C语言伪代码实际上是两个函数的定义,我们分别来分析它们的预期目的、参数的作用以及详细功能。

第一个函数(sub_1400144C0)的预期目的:
该函数的预期目的是生成一个无符号整数作为随机数或者用作特定目的的标识符。

参数的作用:
该函数没有任何参数。

详细功能:

创建一个无符号整数变量 v1,并初始化为 0。
使用 GetSystemTimeAsFileTime 函数获取当前系统时间,并将其存储在 SystemTimeAsFileTime 结构体中。
将 SystemTimeAsFileTime 的值转换为无符号整数,并存储在 v1 中。
对 v1 进行位异或操作,依次与当前线程 ID 和当前进程 ID 进行异或操作。
使用 QueryPerformanceCounter 函数获取性能计数器的值,并将其存储在 PerformanceCount 变量中。
将 v1 与 PerformanceCount.QuadPart 进行位异或操作,然后将 PerformanceCount.LowPart 左移 32 位与其异或,再将 v1 与结果进行异或。
将结果与 0xFFFFFFFFFFFF 进行位与操作,以保留低 48 位的值。
返回结果作为函数的输出。
第二个函数(sub_1400145B0)的预期目的:
该函数的预期目的是生成一个安全的随机数或者用作特定目的的标识符,并更新安全 cookie 的值。

参数的作用:
该函数没有任何参数。

详细功能:

检查全局变量 _security_cookie 的值是否等于 0x2B992DDFA232i64。
如果 _security_cookie 的值等于 0x2B992DDFA232i64,则执行以下步骤:
调用 sub_1400144C0 函数获取一个随机数或标识符,并将其存储在 v1 中。
如果 v1 的值等于 0x2B992DDFA232i64,则将其更新为 0x2B992DDFA233i64。
将 v1 的值赋给 _security_cookie 和 qword_14001E080。
将 v1 的按位取反作为函数的返回值。
如果 _security_cookie 的值不等于 0x2B992DDFA232i64,则将 _security_cookie 的按位取反赋给 result 和 qword_14001E080。
返回 result 作为函数的输出。
根据这两个函数的功能,可以将第一个函数命名为 generateRandomIdentifier,将第二个函数命名为 updateSecurityCookie。

---GPT_END---

# PART 2
过进一步分析,我可以给出更准确的关于该程序的运行目的和大概功能的推测。

该程序的运行目的:
该程序的运行目的是生成一个安全的随机数或标识符,用于加强程序的安全性和防止恶意攻击,特别是针对缓冲区溢出等安全漏洞的攻击。

该程序的大概功能:

sub_1400144C0 函数用于生成一个随机数或标识符。

首先,该函数获取当前系统时间,并将其转换为一个无符号整数。
然后,与当前线程 ID 和当前进程 ID 进行异或运算,以增加随机性。
最后,使用性能计数器的值进行一系列位异或操作,并将生成的随机数或标识符返回。
sub_1400145B0 函数用于更新安全 cookie 的值。

首先,该函数检查全局变量 _security_cookie 的值是否等于特定的常量(0x2B992DDFA232i64)来验证安全性。
如果 _security_cookie 的值等于特定常量,则调用 sub_1400144C0 函数生成一个新的随机数或标识符,并将其赋给 _security_cookie 和另一个全局变量 qword_14001E080。
如果 _security_cookie 的值不等于特定常量,则将 _security_cookie 按位取反,并赋给 result 和 qword_14001E080。
综上所述,该程序的大概功能是生成用于加强程序安全性的随机数或标识符,并通过更新安全 cookie 的值来保护程序免受潜在的攻击。这种机制可以增加程序的安全性,防止某些类型的攻击,如缓冲区溢出。但具体的功能和用途仍需要查看完整的源代码或相关文档以进行确认。

可能是由于目标代码比较简单,并没有比较出明显差距。但WPeChatGPT所使用的提示也启发了我们:

  1. 还应该让大模型关注参数和返回值
  2. 逐步完成任务,先仔细分析,再综合分析。

总结

  1. 大模型在逆向任务中大有用处,但也存在能力边界

    1. 大模型目前不能帮助我们完成反编译工作,IDA Pro这样的专业逆向工具还是非常强力的。

    2. 大模型具有丰富的知识,其在函数名恢复和函数库推测上有优势。

    3. 大模型对函数功能的总结可以帮助我们快速理解函数功能或对我们的猜测工作给予指引,这将节省我们非常多的时间。

  2. 合理设计Promot‘

    1. 让模型扮演一个角色
    2. 指引大模型分步骤完成任务
    3. 设计良好的格式
    4. 补充必要的知识/上下文:在使用时应该提供伪C代码并尽量补充涉及的函数的实现。
  3. 逆向任务中ChatGPT3.5 > 通义千问 > 文心一言

5 日志
4 标签
RSS
© 2025 F0rest
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4