MENU

记一道nc杂项

November 1, 2021 • Read: 570 • CTFer,Misc

记一道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的日常用法
  1. 创建 screen -S 作业名称 如:screen -S ctf
  2. 离开Ctrl+a d键
  3. 查询所有的screen screen -ls
  4. 重新进入screen screen -r screen_id 如:screen -r 2267
Last Modified: November 15, 2021