pwntools交互题,连接环境
要成功计算150次式子,中间停顿几秒就会终止
在把环境的源代码放进IDE,F5查看代码,在计算正确150次后会进入进入目标系统的/bin/sh文件夹
int __cdecl main(int argc, const char **argv, const char **envp) { unsigned int seed; // ST14_4 unsigned int v4; // ST18_4 unsigned int v5; // ST1C_4 unsigned int v6; // ST20_4 unsigned int v7; // ST24_4 signed int v9; // [rsp+10h] [rbp-130h] char buf; // [rsp+30h] [rbp-110h] unsigned __int64 v11; // [rsp+138h] [rbp-8h] v11 = __readfsqword(0x28u); setvbuf(stdin, 0LL, 2, 0LL); setvbuf(stdout, 0LL, 2, 0LL); setvbuf(stderr, 0LL, 2, 0LL); v9 = 0; seed = time(0LL); srand(seed); do { alarm(5u); v4 = rand() % 200; v5 = rand() % 200; v6 = rand() % 200; v7 = rand() % 200; puts("Pass 150 levels and i will give you the flag~"); puts("===================================================="); printf("Now level %d\n", (unsigned int)v9); printf("Math problem: %d * %d - %d + %d = ??? ", v4, v5, v6, v7); puts("Give me your answer:"); read(0, &buf, 0x80uLL); if ( (unsigned int)strtol(&buf, 0LL, 10) != v5 * v4 - v6 + v7 ) { puts("Try again?"); exit(0); } puts("Right! Continue~"); ++v9; sleep((unsigned __int64)"Right! Continue~"); } while ( v9 <= 149 ); if ( v9 != 150 ) { puts("Wrong!"); exit(0); } puts("Congratulation!"); system("/bin/sh"); return 0; }
写脚本进行交互
from pwn import * context.log_level = 'debug'#用来输出交互信息 p=remote('node4.buuoj.cn','28602')#连接环境 for i in range(0,150): ou=p.recvuntil('problem: ')#定位到问题 print (ou)#输出问题信息 a=int(p.recvuntil('*')[:-1])#获取第一个值 b=int(p.recvuntil('-')[:-1])#获取第二个值 c=int(p.recvuntil('+')[:-1])#获取第三个值 d=int(p.recvuntil('=')[:-1])#获取第四个值 p.sendline(str(a*b-c+d))#发送计算结果 p.interactive()#与远端交互,这样才能远程命令去找flag。#interactive模式下,输入一句就执行一句,变量也会被保存。
进入了目标系统的/bin/sh,用ls指令显示所以文件
发现了flag.txt文件,用cat指令捕获,得到flag
查看文件系统信息
对相应系统进行操作,搜索“flag”关键词
提取flag.txt
在010打开发现是乱码
在回去看了看剪贴板数据
进行base64解码,得到flag
获取用户的hash值
进行MD5解码可以得到密码
一个很长的算术式子,x=0时得到119,对应的ascii码字符是w,所以flag应该就是把x从0开始,把计算结果转换成字符
写脚本
import sympy flag = "" x = sympy.symbols('x')#声明变量,以供使用数学表达式 y = eval(open("1.txt","r").read())#把字符串当成算术表达式,返回结果 for i in range(57): flag += chr(y.subs(x,i))#给x赋值i print(flag)
得到flag
拿到一个文件,用010查看发现是png,看着像重叠的二维码,放进Stegsolve,提取出每个颜色通道的图片
图片太小太糊了,把它们在表格里画出来
每一行取一列拼凑,是汉信码,改一下角落的标识符
最后因为自己的有点小瑕疵,照着别人的改了一下,在随便补两划,扫出flag
得到一个视频,分离出一个压缩包和很多图片
压缩包提示了掩码
图片的第65张损坏了,用010打开,发现是rar,修改一下文件头
rar有密码,不能用工具直接进行掩码爆破,用hash爆破
破解时间太久了,后面没去管它,去看了别人爆破出来的是GW5!3#,取出一个无后缀文件,用010查看是png,加上后缀得到flag
一个mc的游戏签到题,做完任务就有flag,但我懒得做,找到了一个新工具FileLocator,可以直接搜索文件夹中的文本,跟网页ctrl+f一样
四个部分拼接起来,得到flag{w3lc0me_t0_9kctf_2021_Check_1n}