BUUCTF jarvisoj_guess
main函数里面对我来说有一些难点,就是socket编程,正在学计网,到学期后半段可能会有写socket编程的作业,先了解一下
看到这里就能看出,程序里面也用到了其中一个结构 sockaddr_in
这个结构就是保存socket的信息的
这是地址族,看不太懂,可能和这道题没太大关系,堆在这用到的时候看一下
先是用 socket’ 函数创建了一个套接字
这里的 af = 2 就是上面地址族写到的 AF_UNSPEC 是同时适用 ipv4 和 ipv6吧
这个似乎也没什么好说的 , type = 1 说明用的是 UDP ?还没学到这。。。
这里注意最后一句,, 将protocol=0 系统自动推算出使用的协议
这个函数是把9999转为网络字节序,,所以这个套接字的端口号在 9999
这里有几个关于socket的函数
bind 函数是给创建的套接字“命名”,,就是指定套接字的端口之类的
listen函数将套接字设置为监听,也就是相当于一个服务器,有客户端请求连接的话就把他连进来,第二个参数设置了请求队列的大小,达到大小之后就拒绝连接
之后进入了循环,开始监听端口 9999,
利用accept函数,如果没有人链接就一直循环,有要连接的就创建一个新的套接字用于发送与接收。
在贴一张socket模型图
所以说程序里那个 s 套接字就负责监听,,然后有连接的 才创建 s_ 套接字负责发送接收
这是pwn吗???前面这一大堆也没啥用啊感觉,这就是为了让我学一下socket么??8错
之后进入正题
如果有连接进来的就创建 s_ 套接字,,然后生成子进程,,(子进程在自己的程序里pid为0,
,然后可以看到如果成功进入了子进程就关闭了 s 套接字,来处理 s_ 套接字,,之后进入 handle 函数
注意这里有定时函数,2分钟,后面会有些限制
这里我理解的是,本来程序 stdin 和stdout 的文件描述符是 0 和 1,但是这个程序把 0 和 1 设置给了 s 套接字(是传进来的 s_ ),这样输入输出就都是对于网络的了吧,具体的还得查
之后就进入了处理函数,,
先是输入你的东西,,然后 rtrim 函数把换行符啥的转为 \x00
然后调用 is_flag_correct 判断你输入的flag对不对
对或者不对输出的话不一样,,然后一直循环这个过程
进入 is_flag_corret 函数
这里真是有点像逆向了,,
首先只能输入100个字节,,
将 0x401100 地址里面的内容复制到 bin_by_hex
将flag(这里是假的)复制到 flag参数
把声明的大小为 50 的 given_flag 参数里面的里面都置零
下面处理flag的函数就有些问题了:
(太晚了明天写完,!!)