引言:今天在buu上看见了个水题
题目为 [FlareOn3]Challenge1
main
这个main逻辑清晰
先printf再scanf 然后sub_401260最后strcmp
这个sub_401260是一个换表base64,主要注意力不是这里所以我就不用它了
不过他实现printf和scanf的方法我觉得挺有意思
所以我也打算实现一下
mymain
1 |
|
看看WriteFile的声明
1 | BOOL WriteFile( |
hFile是一个句柄,
文件或I / O设备的句柄(例如,文件,文件流,物理磁盘,卷,控制台缓冲区,磁带驱动器,套接字,通信资源,邮槽或管道)。
代码里用的是Output句柄也就是STD_OUTPUT_HANDLE,就是标准输出句柄,是从GetStdHandle里面来的
GetStdHandle百度百科如下
1 | WriteFile(Output, "Enter password:\r\n", 0x12u, &NumberOfBytesWritten, 0); |
那么这两句代码就好理解了
在标准输出句柄写”Enter password:\r\n”,长度18,把写了的长度记录在变量NumberOfBytesWritten里,最后的null暂且不管
在标准输入句柄读,把读到的0x80个字节写到Buffer里,把写了的长度记录在变量NumberOfBytesWritten里,最后的null暂且不管
虽然不是很懂为什么用这两个句柄就可以操作控制台输入输出,其中原理应该与printf和scanf有相同之处吧,不过因为没有去读源码,所以还是以后再说吧
另一个例子
之前那篇用管道爆破控制台程序里面也用了WriteFile,也一起看看吧
1 | CreatePipe(&hReadPipe1, &hWritePipe1, &sa, 0); |
这里是获取了新开程序的标准输入输出流,再进行指定的输入以及获取输出进行处理分析,分析满足条件则爆破到正确的flag
有兴趣的小伙伴可以翻翻前面的文章