newstar_week2
RE
PZthon
发现是python写的,先用 pyinstxtractor解包,然后将PZthon.pyc用pycdc反编译得到源码
异或一下拿到flag
SMC
smc 顾名思义Self-Modifying Code,将代码加密,在运行的时候运行解密的函数,解密加密的代码
这里首先用了一个 VP函数改变了text段的权限,然后通过sub_401042() 里的逻辑,对加密的代码解密,只需要用idapy写一个解密的逻辑,然后转unk类型 转function类型,就能看到加密前的逻辑了
操作结束后,将类型先转换成unk ,然后转换成function,就能看到原来的逻辑
先加五,再异或 0x11 就能拿到flag了
Petals
这里有个loc_1209的段 反编译有问题
这里有个花指令,call 了一个无效的地址,nop一下,重新打包main function反编译就显示正常了
这里的逻辑是通过 ~(i ^ a2) 来初始化一个 255的数组,将flag的值当做下标选取v5数组中的值替换flag[i] ,置反的话,首先是生成一个 ~(i ^ a2)的数组,然后根据cmp的数据去查找~(i ^ a2) 对应数据的下标,下标拼接再md5就是flag
AndroGenshin
逻辑大概是用 it_is_not_RC4.rc4函数和genshinimpact key去加密base64table,用加密的base64table和it_is_not_base64去加密password,和一个字符串进行cmp,置反的流程是先算出解密的base64table是多少,用解密后的base64table去解密cmp的字符串就能拿到flag
C?C++?
用die发现是.net的程序,ida打开全是msil,搜索了一下,可以用jb家的dotPeek来反编译,反编译后的逻辑是这样的,先将inputString按字节加上一个范围是0-35的 index,减去' '的ascii,然后进行一个块操作,块大小为5字节,循环七次,对每个块中的每个字节,都有一个独立的+=的操作。分析清楚逻辑后就可以开始置反操作写解密脚本啦
R4ndom
这个题好坑,有个srand不在main里面,导致出来的随机数都是错误的
PWN
ret2libc
通过put_plt put_got 还有 read_got的方式泄露这两个地址,用libcsearcher 去找对应的libc版本,找到后根据libc中的偏移算出libc的基地址,然后就能拿到system和binsh啦
canary[补]
这里read buf后 printf(buf)有一个格式化字符串漏洞,可以通过格式化字符串漏洞泄露栈上数据,使用%n$p这种格式来定位canary的位置,然后带上canary溢出,return到backdoor就好了
偏移可以用pwngdb中的fmtarg插件来计算,具体用法是运行到printf函数的时候 fmtarg addr格式,addr这里输入一个想要去到的地址,就会算出偏移,有的时候需要填充一些字符,让泄露的数据显示完全,具体的计算方法是,printf(%p)的话,是打印一个八字节的地址,首先保证格式化字符串的长度是8的倍数,填充n个字符,然后用fmtarg算出的偏移+这个倍数就好了
secret number[补]
看了下wp,原来有fmtstr_payload()这样的函数,只要设置好偏移和要修改的地址,要修改的值,就能自动生成格式化字符串,这道题开了pie,思路是泄露一个和elf相关的地址来计算elf_base,然后通过elf_base去取随机数的地址,再通过格式化字符串任意地址写往随机数的位置写一个值就好了
stack migration[补]
去学习了一下栈迁移的原理,核心是利用两次leave;ret把rsp迁移到一个布置好的新栈,这里v2是一个很合适的"栈",然后read v2刚刚好可以用来布置新栈,上面的%s可以用来泄露一个libc的地址,来计算libc_base拿到system和binsh,也有pop rdi ret这个gadget,所以利用思路是,先用%s泄露一个libc地址,计算出libc_base拿到binsh system的地址,往v2中布置 pop rdi ret + binsh + system,覆盖rbp为v2的地址,rbp + 8 位leave;ret 来栈迁移到v2上执行system(binsh)
shellcode revenge[补]
这一题很巧妙,这个程序的意思是分配一块可读可写可执行大小为0x1000字节的内存,然后往这块内存中最多写255个字节的数据,最后跳转到这块内存中执行这块内存上面的代码。
但是对输入数据有个限制,输入的数据必须在0-9 A-Z这个范围内,构造一个符合这个限制的shellcode是很困难的
在jmp到这块内存的时候,可以发现rax rdi rsi rdx的状态,如果在遇到一个syscall,那就是 read(0,0x66660000,0x66660000)这个状态,那能不能构造一个syscall,使得程序再read一遍,然后写入shellcode
这周有些忙,没有花太多时间在newstar上qaq