逆向审逻辑
整理电脑翻出两个题目,一个re,一个pwn,复盘起来还得是需要仔细耐心。简单记录下。
justamat
23年蓝帽杯半决赛的一个re,题目不难,但是刚开始逆关键点没找那么准,另外矩阵计算方法也不熟。
elf程序,没有main函数,直奔start去。那么运行的函数应该是sub_404520这个了。
进来看到welcome字符,那么做题来说,应该是到了程序开始的部分了。(下面strcpy和printf是手动重命名的
此处提示good字符,那么上面的if应该是运算判断,跟进去看。
红框处的代码是对于传入的矩阵进行了乘法运算,矩阵运算中*(_DOWRD *)matrix_ptr != (_DWORD)sum_product
是对矩阵乘法计算出的每一位,和data2中相应位置的数据进行比较,不相等会跳出do-while循环,相等则继续循环下一位。因此只要输入的矩阵和data1计算的结果与data2全部相等即可。
知道运算过程,再看data1和data2的数据类型。在运算过程中都强转成DWORD
类型,长度4字节。根据v11、v12数组400字节的长度,所以data1、data2矩阵元素数量为100个。
根据前面计算过程的分析,我们只需要知道data1、data2的数据,获得矩阵的逆就可以知道,应该要输入的数据是什么了。要导出data1、data2,首先创建结构体。
对存储的数据应用创建的结构体,再shift+e
导出初始化后的数组。
直接给出exp,可以不用算逆,用z3爆破。
result =[
116275,
122772,
134847,
178752,
125060,
155857,
129457,
125466,
126634,
122802,
115152,
126706,
136929,
179712,
129886,
154996,
126976,
131798,
131074,
122366,
114711,
127116,
141302,
182202,
131502,
163775,
134689,
130908,
130402,
125256,
114286,
128215,
142477,
181075,
129243,
159261,
130913,
125455,
127190,
126376,
109949,
98840,
117972,
145846,
109644,
134524,
121191,
107764,
117464,
104110,
99099,
97861,
118991,
147167,
98734,
137056,
119732,
95702,
97594,
104783,
71837,
85199,
87694,
98027,
78462,
92741,
76065,
73712,
79427,
71465,
86417,
97559,
94818,
108643,
94224,
97040,
85916,
82920,
89755,
74796,
63116,
71978,
86189,
111008,
85088,
98987,
81739,
82342,
88739,
79305,
120943,
125178,
136589,
179628,
134735,
163558,
136121,
134790,
135679,
123375
]
data1 =[
254,
11,
29,
246,
131,
255,
224,
184,
221,
176,
197,
222,
246,
20,
159,
221,
217,
7,
45,
107,
25,
202,
115,
253,
135,
114,
36,
4,
73,
126,
169,
206,
145,
190,
65,
24,
96,
63,
43,
99,
28,
210,
144,
233,
142,
186,
30,
243,
65,
173,
44,
3,
105,
218,
16,
253,
253,
231,
6,
54,
214,
2,
89,
24,
204,
80,
135,
175,
251,
24,
68,
127,
173,
248,
44,
103,
29,
34,
132,
172,
14,
35,
220,
230,
187,
210,
184,
74,
188,
222,
80,
156,
28,
30,
134,
58,
45,
221,
195,
3]
from z3 import *
cin = [Int("x[%d]"%i) for i in range(100)]
s = Solver()
for j in range(10):
for ofs in range(10):
sum = 0
for index in range(10):
sum += (cin[j*10 + index] * data1[index*10 + ofs])
s.add(sum == result[j*10 + ofs])
ans = s.check()
ans = s.model()
for m in cin:
print(chr(ans[m].as_long()),end="")
raw_socket
总体来看是检查对socket连接的熟悉程度,耐心分析,并不困难。
首先是main函数,程序运行后,监听默认ip地址 0.0.0.0,同时绑定在指定的端口上。对于远程成功连接上的client分配套接字文件描述符,再创建子进程运行session函数。
跟进session函数。逻辑是,在for的一轮循环中,首先读取输入内容的字节长度;再读取输入的内容并用on_message函数进行处理。其中重点是readBytes和on_message两个函数。
先看readBytes函数。recv函数是c中用于从网络中获取数据的,定义如下。
int WSAAPI recv(
SOCKET s,//标识已连接套接字的描述符。
char *buf,//指向缓冲区的指针,以接收传入的数据。
int len,//buf参数指向的缓冲区的长度(以字节为单位)。
int flags//一组影响此功能行为的标志。
);
逻辑是从client连接的文件描述符中读取4字节长度的数据。
那么再看on_message函数。根据接收内容的第一个字节,如果是1,进入on_file_get分支;如果是4,进入on_get_file_chunk分支。
第一个on_file_get分支,先将输入内容复制到套接字文件描述符+32处指针指向的位置,再调用normalize_path处理输入内容,处理路径后会给a1+4的位置添加标识。
处理文件路径逻辑如下:
- 处理 ".." 目录:
- 如果路径中出现 ".." 且后面紧跟着 "/" 或字符串结尾,则进行以下操作:
- 如果 ".." 位于路径开头,则直接跳过 ".."。
- 如果 ".." 不在路径开头,则从 ".." 向前遍历直到遇到 "/",然后删除 ".." 及其前面的 "/"。
- 如果路径中出现 ".." 且后面紧跟着 "/" 或字符串结尾,则进行以下操作:
- 处理 "." 目录:
- 如果路径中出现 "." 且后面紧跟着 "/",则删除 "." 及其后面的 "/"。
最后,将文件路径和写死的路径拼接起来,并返回给client文件描述符。
回到前面,如果输入的内容第一个是4。先判断有无处理过文件路径,再用fropn打开路径文件,并读取文件,用send_message函数发送。
send_message逻辑就简单,直接用send将读取文件内容发送到client套接字中。
可以写gdb断点文件break.sh
,用命令gdb -x break.sh --args raw_socket 9999
运行。
start
b *$rebase(0x1ce9)
b *$rebase(0x1c24)
b *$rebase(0x1999)
b *$rebase(0x1c3e)
b *$rebase(0x188b)
b *$rebase(0x1d4b)
b *$rebase(0x1be8)
另起一个terminal,运行exp。
from pwn import *
context.arch = "amd64"
host = "127.0.0.1"
port = "9999"
p = remote(host,port)
s = lambda data :p.send(data)
sa = lambda delim,data :p.sendafter(delim, data)
sl = lambda data :p.sendline(data)
sla = lambda delim,data :p.sendlineafter(delim, data)
r = lambda num=4096 :p.recv(num)
ru = lambda delims, drop=True :p.recvuntil(delims, drop)
itr = lambda :p.interactive()
leak = lambda name,addr :log.success(name+"--->"+hex(addr))
def send_struct(data):
size = len(data)
s(p32(size))
pause()
s(data)
file_data = p8(1)+b"flag"
send_struct(file_data)
file_data2 = b"\x04" + b"dead"
send_struct(file_data2)
itr()
平航练习二
Case Information:
Acquired using: ADI3
Case Number:
Evidence Number:
Unique Description:
Examiner:
Notes:
--------------------------------------------------------------
Information for C:\镜像\磁盘镜像_20200901221212:
Physical Evidentiary Item (Source) Information:
[Device Info]
Source Type: Physical
[Drive Geometry]
Cylinders: 14,593
Tracks per Cylinder: 255
Sectors per Track: 63
Bytes per Sector: 512
Sector Count: 234,441,648
[Physical Drive Information]
Drive Model: TO Exter nal USB 3.0 SCSI Disk Device
Drive Serial Number: 201503310007F
Drive Interface Type: SCSI
Removable drive: False
Source data size: 114473 MB
Sector count: 234441648
[Computed Hashes]
MD5 checksum: 39fffb31a8931525fdc6dea45d2bfdf3
Image Information:
Acquisition started: Tue Sep 01 22:12:12 2020
Acquisition finished: Tue Sep 01 22:28:32 2020
Segment list:
C:\镜像\磁盘镜像_20200901221212.E01
案件情况 | 在一起涉网诈骗案件中,办案机关扣押了嫌疑人的电脑以及调取了涉案相关的服务器数据,要求对其数据进行检验分析。 |
---|---|
材料 | 磁盘镜像.E01(SHA1为SHA1: 361F067592F2E8AB79D858BF1C5B0982074EDC86),服务器.zip(SHA256为0142F97C7BFB4EC572C6D1FCBBFDF6E84F314E189867D81AAAC4D6EE2DD91860),共两份文件 |
1、请计算计算机的磁盘SHA256值(2分)
2、记录计算机名与开机用户名(2分)
3、记录计算机操作系统的具体Build版本号(1分)
4、计算机中后缀名是jpg的缩略图数量为(2分)
[☆]5、计算机系统桌面管理应用相关的记录事件ID为(2分)
可以记录下,从事件源来找id。
6、记录当前计算机操作系统使用的文件系统格式(1分)
7、当前计算机操作系统默认的照片查看器为(3分)
8、记录计算机Foxmail软件的安装时间(1分)
9、记录计算机于2020年7月29日最后一次运行navicat时间(2分)
29号没看到运行navicat记录
10、嫌疑人曾用远程工具连接过服务器,列出所有连接过的IP和端口号(3分)
回收站里还一个
11、查找计算机中有关手机应用的痕迹,记录APP文件所在路径(1分)
12、查找嫌疑人电脑上网站源码最可能的来源,并附上截图(3分)
13、接上题,通过对源码分析,判断源码中有关数据库连接信息配置文件名为(2分)
14、记录手机自动连接过的WIFI名称(3分)
15、分析手机数据,请判断微博发送的验证码的短信是否已读,若已读,请写出读取时间(3分)
有时间戳,说明读过。
18位时间戳转换方法:取前9位的数值,数值+978307200,得到一个常见的9位时间戳,使用工具转换成正常时间即可。
import time
timestamp = "617613269013913088"
timestamp = int(timestamp[:9],base = 10) + 978307200
timearray = time.localtime(timestamp)
normaltime = time.strftime("%Y-%m-%d %H:%M:%S", timearray)
print(normaltime)
16、接上题,分析微博账号加入群(戏精学院~武汉基友)的时间(2分)
17、列出手机数据当中,与百度相关的应用名及包名。(1分)
18、统计计算机中,5、6月份工资表发放总额为多少元(3分)
19、嫌疑人曾经登录过某分发网站,查找登录的用户名和密码(3分)
20、提取计算机中名称为“1.jfif”图片中的隐藏文件,并计算其SHA256值(4分)
21、记录计算机中谷歌浏览器下载过的文件总数量(1分)
22、嫌疑人最可能使用哪两个工具登录访问暗网(3分)
23、接上题,写出嫌疑人记录过暗网的相关登录网址及其账号与密码(3分)
24、查找嫌疑人电脑上存有的分发账号,里面的账号共有多少条(2分)
25、计算机中是否存在加密容器,其软件应用名为(3分)
26、接上题,尝试运行容器,记录容器中分别包含的文件名(4分)
常规卷
隐藏卷
标签:10,未定义,文件,记录,标题,data2,data,lambda From: https://www.cnblogs.com/Tw0YY/p/18227275