pwnable input2 之 write up
首先看源代码:
1 input2@ubuntu:~$ cat input.c 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <sys/socket.h> 6 #include <arpa/inet.h> 7 8 int main(int argc, char* argv[], char* envp[]){ 9 printf("Welcome to pwnable.kr\n"); 10 printf("Let's see if you know how to give input to program\n"); 11 printf("Just give me correct inputs then you will get the flag :)\n"); 12 13 // argv 14 if(argc != 100) return 0; 15 if(strcmp(argv['A'],"\x00")) return 0; 16 if(strcmp(argv['B'],"\x20\x0a\x0d")) return 0; 17 printf("Stage 1 clear!\n"); 18 19 // stdio 20 char buf[4]; 21 read(0, buf, 4); 22 if(memcmp(buf, "\x00\x0a\x00\xff", 4)) return 0; 23 read(2, buf, 4); 24 if(memcmp(buf, "\x00\x0a\x02\xff", 4)) return 0; 25 printf("Stage 2 clear!\n"); 26 27 // env 28 if(strcmp("\xca\xfe\xba\xbe", getenv("\xde\xad\xbe\xef"))) return 0; 29 printf("Stage 3 clear!\n"); 30 31 // file 32 FILE* fp = fopen("\x0a", "r"); 33 if(!fp) return 0; 34 if( fread(buf, 4, 1, fp)!=1 ) return 0; 35 if( memcmp(buf, "\x00\x00\x00\x00", 4) ) return 0; 36 fclose(fp); 37 printf("Stage 4 clear!\n"); 38 39 // network 40 int sd, cd; 41 struct sockaddr_in saddr, caddr; 42 sd = socket(AF_INET, SOCK_STREAM, 0); 43 if(sd == -1){ 44 printf("socket error, tell admin\n"); 45 return 0; 46 } 47 saddr.sin_family = AF_INET; 48 saddr.sin_addr.s_addr = INADDR_ANY; 49 saddr.sin_port = htons( atoi(argv['C']) ); 50 if(bind(sd, (struct sockaddr*)&saddr, sizeof(saddr)) < 0){ 51 printf("bind error, use another port\n"); 52 return 1; 53 } 54 listen(sd, 1); 55 int c = sizeof(struct sockaddr_in); 56 cd = accept(sd, (struct sockaddr *)&caddr, (socklen_t*)&c); 57 if(cd < 0){ 58 printf("accept error, tell admin\n"); 59 return 0; 60 } 61 if( recv(cd, buf, 4, 0) != 4 ) return 0; 62 if(memcmp(buf, "\xde\xad\xbe\xef", 4)) return 0; 63 printf("Stage 5 clear!\n"); 64 65 // here's your flag 66 system("/bin/cat flag"); 67 return 0; 68 }
1 argv['A'] = "\x00";
argv['B'] = "\x20\x0a\x0d";
argv['C'] ="55555";
这里可以用’A’作为参数的索引,这是原来没有见过的,默认把字符转换成ASCII码了。
2 execve函数
execve(执行文件)在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。
int execve(const char * filename,char *const argv[ ],char * const envp[ ]);
execve()用来执行参数filename字符串所代表的文件路径
第二个参数是利用指针数组来传递给执行文件,并且需要以空指针(NULL)结束
最后一个参数则为传递给执行文件的新环境变量数组
3 进程间通信(以后再补上)
4 socket编程
一般的模式:
(1)建立套接字:sockfd = socket(AF_INET,SOCK_STREAM,0)
AF_INET:IPV4
SOCK_STREAM:TCP
最后一个参数一般为0
(2)设置socket_in结构中的参数(套接字地址),包括Ip、端口和IPV4or6
http://www.cnblogs.com/hnrainll/archive/2011/04/24/2026432.html
(3)bind监听函数
http://blog.chinaunix.net/uid-24954950-id-2956469.html
(4)listen函数
http://blog.chinaunix.net/uid-25749806-id-348681.html
(5)accpet函数
http://blog.chinaunix.net/uid-25749806-id-348689.html
(6)recv/send函数
http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html
还是不太明白,这题在搞什么
转载于:https://www.cnblogs.com/liuyimin/p/7278435.html
pwnable input2 之 write up相关推荐
- pwnable.kr第七八题 input leg
第七题 input 参考链接: 这道题可太痛苦了,好多知识点: 这里只需要按它的比较走就可以了. 解题过程 第一次比较: 这里只需要让输入的长度为100,并且满足argv['A'].['B']的值即可 ...
- pwnable.kr 简单题目详细笔记汇总
文章目录 fd collision bof flag passcode random input leg mistake shellshock coin1 lotto cmd1 cmd2 uaf bl ...
- PWN input [pwnable.kr]CTF writeup题解系列7
目录 0x01题目 0x02解题思路 0x03题解 0x01题目 0x02解题思路 先连接到服务器看下情况 root@mypwn:/ctf/work/pwnable.kr# ssh input2@pw ...
- PWN lotto [pwnable.kr]CTF writeup题解系列10
目录 0x01题目 0x02解题思路 0x03题解 0x01题目 0x02解题思路 下载文件,检查一下情况 root@mypwn:/ctf/work/pwnable.kr# ssh lotto@pwn ...
- PWN uaf [pwnable.kr]CTF writeup题解系列13
目录 0x01题目 0x02解题思路 0x03题解 0x01题目 0x02解题思路 题目都已经介绍了这是一道Use After Free的题目,那我们就不用多想了,先看看题目主要内容 root@myp ...
- pwnable.kr之Toddler‘s Bottle前八题知识点记录
pwn刷题网站地址(点击直达): http://pwnable.kr/play.php 文章目录 第一题 fd 第二题:collision 1.首先是char和int数据类型的转换 2.python实 ...
- Pwnable之[Toddler's Bottle](一)
Pwnable之[Toddler's Bottle] Pwn挑战地址 1.fd #include <stdio.h> #include <stdlib.h> #include ...
- 【pwnable】asm之write up
首先查看源代码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <s ...
- pwnable.kr lotto题解
ssh lotto@pwnable.kr -p2222 (pw:guest) 题目源码: #include <stdio.h> #include <stdlib.h> #inc ...
最新文章
- #串口通信超时处理_实现4G无线通信透传的远程通信多组网5个PLC相互交换数据...
- ansible+powershell DSC 可以管理windows server了
- VTK:几何对象之Tetrahedron
- java的简单工厂模式_java设计模式之简单工厂模式
- ActionScript 3.0 学习笔记三
- java保留二位小数_java使double保留两位小数的多方法 java保留两位小数
- 用 Python 制作关不掉的端午安康弹窗
- Newsmy纽曼星云1000G移动硬盘拆解教程
- php新闻管理系统(简单)学习教程
- PDF Expert 2.5.13 极致的 PDF 阅读标注工作体验
- 中职计算机组装与维修知识点,中职计算机组装与维修的教学分析与对策
- 【老生谈算法】matlab实现Kmeans算法源码——Kmeans算法
- websphere html 缓存,如何清除WebSphere类缓存
- 参考线平滑-FemPosDeviation-SQP
- 数据分析可视化- 十三朝古都西安
- 王达人漫展1,cosplay
- vimdiff 命令使用技巧
- MLY翻译 -- 3.Prerequisites and Notation
- Vue的props的三种写法
- 理论力学类毕业论文文献包含哪些?
热门文章
- Oracle事务的隔离
- VUE2.0开发环境安装
- 浅谈数据库优化方案--表和SQL
- 【错误记录】Groovy工程中的文件查找策略 ( main 函数中需要使用 src/main/groovy/Script.groovy | Groovy 脚本直接使用代码相对路径 )
- 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 通信场景 | Channel 通信机制 | Channel 支持的通信数据类型 | Channel 类型 )
- 【鸿蒙 HarmonyOS】UI 布局 ( 帧布局 StackLayout )
- 【计算理论】可判定性 ( 通用图灵机和停机问题 | 可判定性 与 可计算性 | 语言 与 算法模型 )
- 【Android 应用开发】 Android 相关代码规范 更新中 ...
- grid - 使用相同的名称命名网格线和设置网格项目位置
- Nginx初学第一步