2024 NEWSTAR CTF WEEK1 writeup (上)

admin 2024年10月12日10:55:59评论17 views字数 4641阅读15分28秒阅读模式

前言

本系列为CTF专栏篇,在此特别感谢上海电力大学白帽子网络安全社团供稿支持,OneTS安全团队也将持续关注CTF、AWD等竞赛题目分享。同时,欢迎大家投稿分享相关内容,或者关注公众号加入网络安全技术交流群共同探讨。

💌题目来源:NewStar CTF 2024 (https://ns.openctf.net/)

Pwn方向

🔹Real Login

使用 IDA 反编译。很明显,输入的内容和全局变量 password 一致,就能进入 win 函数获取 Shell.

2024 NEWSTAR CTF WEEK1 writeup (上)

password 内容为 NewStar!!!

2024 NEWSTAR CTF WEEK1 writeup (上)

所以 nc 连上后输入 NewStar!!! 即可

🔹Game

本题主要考查 pwntools 库中 recv 和 send 的使用。

解法一

在 5 秒时间内,只能输入小于等于 10 的数,使这些数字相加大于 999.

所以手动输入就不可能了

当然也可以搞个宏什么的?

写 Python 脚本即可。

Pythonfrom pwn import *p = remote("ip", port)for i in range(112):    p.sendlineafter(b': ', b'9')p.interactive()

解法二

另一种解法,可以利用 scanf 函数的 %d 格式解析特性。

scanf 在解析 %d 遇到非数字的时候,会停止解析,但不会抛出异常,会直接返回目前的结果。

比如下面这个语句:

scanf("%d", &value);

假设 value 原本是 10,如果输入 1a ,那么会解析到 1 的输入,而忽略后面的a,这时候 value 会被变成 1.

如果不输入数字,直接输入 a ,这时候,scanf 什么数字也解析不到,也就无法对 value 做修改。

是的,这时候 value 的值没有变!并且由于这个解析的异常,会导致输入缓冲区无法被刷新,也就是说下一次调用的时候,下一个 scanf 会从 a 开始解析。

这么一想,那么我只需要输入寥寥几个字符,比如:10a ,第一次调用 scanf 会解析出 10,并且给结果加上 10. 后面每次循环,scanf 会从剩下的 a 的位置进行解析,但是由于不是数字会被忽略,所以这个多出来的 a 就一直在!并且 value 的值没有变,保留上一次的 10. 因此,scanf 永远无法跳过这个 a 字符,最终就导致一直加 10,直到结果大于 999。

2024 NEWSTAR CTF WEEK1 writeup (上)

更多技术交流可扫码进群

🔹Overwrite

IDA 反编译查看源代码

2024 NEWSTAR CTF WEEK1 writeup (上)

在这个函数中,我们可以输入一个数值 nbytes,然后读取相应长度的数据到 nbytes_4 中。如果 nptr 中的字符串被转换为数字且大于 114514,程序会打印 flag,否则会输出钱包空的信息。

漏洞分析:

nptr 和 nbytes_4 之间的偏移是 0x30。如果输入大于 0x30 的正整数,程序将会通过 exit() 退出。

观察到,read() 函数中使用的是 unsigned int nbytes,但在输入校验时 nbytes 是 int 类型,进行了有符号比较。这里产生了漏洞。

2024 NEWSTAR CTF WEEK1 writeup (上)

例如,-1 的 16 进制表示是 0xffffffff,对于有符号整数来说,这是一个负数;但在无符号整数中,它代表一个非常大的正整数。

因此,利用这一点,输入一个负数值,可以绕过前面的大小检查,将后续输入的数据覆盖到 nptr,从而完成利用。

Pythonfrom pwn import *context.terminal = ['tmux','splitw','-h']# p = process('./pwn')p = remote('ip', port)payload = b'a'*0x30 + b'114515'p.sendlineafter(b': ', b'-1')p.sendafter(b': ', payload)p.interactive()

🔹Gdb

先拖入 IDA 分析:

2024 NEWSTAR CTF WEEK1 writeup (上)

可以看到程序逻辑是对一串字符串执行了加密操作,然后需要我们输入加密后的内容。

对于加密函数,可以发现完全看不懂(其实是故意的)

所以我们选择动调查看加密后的内容

键入gdb ./gdb并运行,先运行程序,用b *$rebase(0x1836) 断点(断在call 加密函数处)

2024 NEWSTAR CTF WEEK1 writeup (上)

运行到加密函数处,可以发现,rdi寄存器存的是要加密的内容,rsi存的是加密的key。

先复制下要加密内容的地址

0x7fffffffd717

然后使用 ni 指令步进

此时字符串已经完成了加密,我们使用 tel 0x7fffffffd717 指令查看字符串的内容

2024 NEWSTAR CTF WEEK1 writeup (上)

b'x5dx1dx43x55x53x45x57x45' 便是加密后的内容,使用 Python 脚本发送即可。

#!/usr/bin/env python3from pwn import *p = process('./gdb')elf = ELF('./gdb')data = b'x5dx1dx43x55x53x45x57x45'p.sendline(data)p.interactive()

2024 NEWSTAR CTF WEEK1 writeup (上)

更多技术交流可扫码进群

Reverse方向

🔹begin

首先运行一下这个程序

2024 NEWSTAR CTF WEEK1 writeup (上)

可以发现很多提示,我们根据提示首先使用 IDA 打开,接下来按下 F5 得到伪代码

2024 NEWSTAR CTF WEEK1 writeup (上)

根据提示,我们点击 flag_part1 这个变量,从而得到 flag 的第一部分

2024 NEWSTAR CTF WEEK1 writeup (上)

如果 IDA 显示是十六进制数据,则可以在十六进制数据那按下 A,从而得到字符串

接下来返回主函数界面,可以点击标签栏中的 Pseudocode-A

再根据提示,按下 ⇧ ShiftF12

2024 NEWSTAR CTF WEEK1 writeup (上)

可以看到一个很明显的字符串,点进去,从而得到 flag 第二部分

根据提示,在 Format 上按下 X 查看是谁引用了这个字符串

2024 NEWSTAR CTF WEEK1 writeup (上)

再根据提示,在函数名字上按下x键找到是哪个函数引用了这个函数

2024 NEWSTAR CTF WEEK1 writeup (上)

根据提示,这个函数名就是最后一部分,并且在最后加上 }

2024 NEWSTAR CTF WEEK1 writeup (上)

则最后拼起来的 flag 是 flag{Mak3_aN_3Ff0rt_tO_5eArcH_F0r_th3_f14g_C0Rpse}

🔹base64

在开始之前,你需要知道什么是 Base64,可参见密码学base的WriteUp: 

https://ns.openctf.net/wp/2024/week1/crypto/base.html

此题目是教大家定位主函数,Base64 的一个常见的魔改方式——换表,以及 CTF 一个编解码工具 CyberChef.

双击打开程序,我们看到如下界面:

2024 NEWSTAR CTF WEEK1 writeup (上)

可以看到让你输入一个字符串,然后会判断对错。一般来说,"Enter the flag:"这个字符串会离主逻辑不远,所以我们找到这个字符串的位置就可以定位到主逻辑。

在 IDA 中,按 ⇧ ShiftF12 调出字符串界面。

2024 NEWSTAR CTF WEEK1 writeup (上)

双击就可以转到对应的 IDA View.

2024 NEWSTAR CTF WEEK1 writeup (上)

双击 DATA XREF 右边的地址加偏移,就可以到引用他的地方,按下 F5,即可反编译这段逻辑。

2024 NEWSTAR CTF WEEK1 writeup (上)

这就是主逻辑了。看到 = 结尾的字符串可以想到 Base64(常识)。但是直接解会出乱码。

此处需要大家识别出 Base64 算法的魔改点。大家可以自行对比标准的 Base64 编码算法,为了不过多增加难度,我仅把码表换了。

2024 NEWSTAR CTF WEEK1 writeup (上)

base64标准码表是 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

这里换成了 WHydo3sThiS7ABLElO0k5trange+CZfVIGRvup81NKQbjmPzU4MDc9Y6q2XwFxJ/.

推荐使用iCyberChef进行解密,这个工具用了的都说牛逼,你也来试试吧!

公众号后台回复【icyberchef】获取网盘下载链接!

2024 NEWSTAR CTF WEEK1 writeup (上)

把左边的「From base64」拖到「Recipe」那一栏,然后把「Alphabet」换成上面说的魔改后的码表,「Input」处输入密文,「Output」处就得到 flag 了。当然,编写脚本解码也是可以的。

🔹ezAndroidStudy

本题主要考查对 APK 基本结构的掌握

第一部分

查看 AndroidManifest.xml 可以发现 activity 只有 Homo 和 MainActivity

我们用 Jadx 打开 work.pangbai.ezandroidstudy.Homo 就可以获得 flag1

2024 NEWSTAR CTF WEEK1 writeup (上)

第二部分

打开resources.arsc/res/value/string.xml搜索flag2即可

2024 NEWSTAR CTF WEEK1 writeup (上)

第三部分

按描述到 /layout/activity_main.xml 找即可

2024 NEWSTAR CTF WEEK1 writeup (上)

第四部分

/res/raw/flag4.txt 里

2024 NEWSTAR CTF WEEK1 writeup (上)

第五部分

IDA64 打开 lib/x86_64/libezandroidstudy.so,找到以 Java 开始的函数,按 F5 即可

2024 NEWSTAR CTF WEEK1 writeup (上)

Ans: flag{Y0u_@r4_900d_andr01d_r4V4rs4r}

🔹Simple_encryption

将程序拖入 IDA 并按下 F5 得到主要代码

2024 NEWSTAR CTF WEEK1 writeup (上)

主要逻辑非常简单,首先输入 len 个字符,len 点击去可以看到是 30.

然后对输入每一位进行变换,其中当索引值是 3 的倍数时输入值就减 31,当索引值除 3 余 1 时,输入值加 41,索引值除 3 余 2 时,输入值与 0x55 进行异或

最后将变换之后的输入值与密文 Buffer 数组进行比较。我们点进去 Buffer 数组,然后可以按下 ⇧ ShiftE 即可提取数据。

2024 NEWSTAR CTF WEEK1 writeup (上)

我们接下来就可以写出逆向脚本。

#include <stdio.h>unsigned char buffer[]={0x47,0x95,0x34,0x48,0xa4,0x1c,0x35,0x88,0x64,0x16,0x88,0x07,0x14,0x6a,0x39,0x12,0xa2,0x0a,0x37,0x5c,0x07,0x5a,0x56,0x60,0x12,0x76,0x25,0x12,0x8e,0x28};int main(){    int len=30;    for(int i=0;i<len;i++){        if(i%3==0){            buffer[i]+=0x1f;        }        if(i%3==1){            buffer[i]-=0x29;        }        if(i%3==2){            buffer[i]^=0x55;        }    }    printf("%s",buffer);    return 0;}// flag{IT_15_R3Al1y_V3Ry-51Mp1e}

🔹ez_debug

解法一:使用 IDA

步入 main 函数,发现给的 decrypt 提示。如果不知道关键函数可以前后都点一点,发现主要正常的逻辑是在 you 函数里面

2024 NEWSTAR CTF WEEK1 writeup (上)

双击 you 函数,在相关位置下断点。点击旁边的圆圈就可以下断点了,或者按下 F2,之后按 F9 或者在上方选择「Select debugger」进入调试

2024 NEWSTAR CTF WEEK1 writeup (上)

这里在循环处下断点或者在 decrypt 处下断点

2024 NEWSTAR CTF WEEK1 writeup (上)

然后开始调试,跳出弹窗让我们输入 flag

2024 NEWSTAR CTF WEEK1 writeup (上)

因为没有设置长度限制,所以随便输入一些东西就好了,然后就会进入下一步

2024 NEWSTAR CTF WEEK1 writeup (上)

回到 IDA 界面,可以看到程序在断点处自动停止了

2024 NEWSTAR CTF WEEK1 writeup (上)

you 函数是一个解密函数,接下来按下 F8 进行单步调试,检查所有变量后发现每过一个循环,v5 的值会变化,且有类似 flag 的产物,所以等单步把循环过完之后,直接双击 v5,查看变量

2024 NEWSTAR CTF WEEK1 writeup (上)
2024 NEWSTAR CTF WEEK1 writeup (上)

解法二:使用 xdbg

拖入 xdbg64,搜索字符串

2024 NEWSTAR CTF WEEK1 writeup (上)

搜索 de 或者 flag,发现 decrypt flag

2024 NEWSTAR CTF WEEK1 writeup (上)

在 decrypt 处按 F2 下断点

2024 NEWSTAR CTF WEEK1 writeup (上)

然后按下 F9,随便输入一些字符即可

2024 NEWSTAR CTF WEEK1 writeup (上)

继续按下 F9

2024 NEWSTAR CTF WEEK1 writeup (上)

公众号后台回复【社群】即可加入网安技术交流群

随时了解新动态,更多干货等着你

原文始发于微信公众号(OneTS安全团队):2024 NEWSTAR CTF WEEK1 writeup (上)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月12日10:55:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   2024 NEWSTAR CTF WEEK1 writeup (上)http://cn-sec.com/archives/3254314.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息