记一道nc杂项
wp:
# -*- coding: utf-8 -*-
from pwn import * #报错的,pip install pwntools
context.log_level = 'debug'
io = remote('114.114.114.114', 10002) #远程连接
# 本地调试
#io=process('./guess_num')
payload = [0 for x in range(0,60)] #先把答案设置成60个‘0’
restart = 1
while restart:
restart = 0 #先把restart改为0,避免死循环
for i in range(60): #循环发送答案
io.recvuntil('0 or 1\n') #接收函数,当接收到这个时才能发送答案
io.sendline(str(payload[i])) #发送第i个答案
p = io.recv(3) #接收判断答案是否正确的标志,正确continue,否则将答案修改。重新开始循环
if 'you' in p:
continue #接收到'you'则说明这个答案对了,继续进行下一个for语句发送下一个答案
else:
payload[i] = 1 #将第i个答案改正
restart = 1 #将restart改为1,将会重新while循环
break
io.interactive()
题目编写
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include<signal.h> //mac不需要
//中断信号接收后处理的函数,防止手工爆破
void handler(int s)
{
printf("\nsorry,you are over time!\n");
exit(0);
}
int main()
{
/* 猜数字游戏*/
//清空缓冲区,使得部署在云端时nc能够返回字符
setbuf(stdout,NULL);
srand ((unsigned) time (0));
//当闹钟函数为0时,信号接收,转而处理handler函数
signal(SIGALRM,handler);
/*
alarm()函数,闹钟函数,它可以在进程中设置一个定时器,
当定时器指定的时间到时,它向进程发送SIGALRM信号。可以设置忽略
或者不捕获此信号,如果采用默认方式其动作是终止调用该alarm函数的进程。
*/
alarm(300);
printf("Let's start the number guessing game \n");
printf("There are 60 rounds. Good luck to you!\n");
int count = 0;
int in;
int flag[60];
for(int i=0;i<60;i++){
flag[i]=rand()%2;
}
while(count < 60){
printf("0 or 1\n");
scanf("%d",&in);
if(in==flag[count]){
printf("%s%d%s\n","you are right! You win ",count+1,"times。");
count ++;
}
else {
printf("Oh no it will be reset\n");
count = 0;
}
}
printf("awsl{this_is_nc_misc}\n");
return 0;
}
云端部署
使用socat将程序放在某个端口上socat tcp-l:10002,fork exec:./guess_num,reuseaddr
部署时可以使用screen,使用定时脚本或者nohup都行
screen的日常用法
- 创建 screen -S 作业名称 如:screen -S ctf
- 离开Ctrl+a d键
- 查询所有的screen screen -ls
- 重新进入screen screen -r screen_id 如:screen -r 2267
版权声明:本文为原创文章,版权归 Bill's Blog 所有,转载请注明出处!如相关链接出现404,可以在文章下面评论留言。