首先看源代码:

 input2@ubuntu:~$ cat input.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h> int main(int argc, char* argv[], char* envp[]){
printf("Welcome to pwnable.kr\n");
printf("Let's see if you know how to give input to program\n");
printf("Just give me correct inputs then you will get the flag :)\n"); // argv
if(argc != ) return ;
if(strcmp(argv['A'],"\x00")) return ;
if(strcmp(argv['B'],"\x20\x0a\x0d")) return ;
printf("Stage 1 clear!\n"); // stdio
char buf[];
read(, buf, );
if(memcmp(buf, "\x00\x0a\x00\xff", )) return ;
read(, buf, );
if(memcmp(buf, "\x00\x0a\x02\xff", )) return ;
printf("Stage 2 clear!\n"); // env
if(strcmp("\xca\xfe\xba\xbe", getenv("\xde\xad\xbe\xef"))) return ;
printf("Stage 3 clear!\n"); // file
FILE* fp = fopen("\x0a", "r");
if(!fp) return ;
if( fread(buf, , , fp)!= ) return ;
if( memcmp(buf, "\x00\x00\x00\x00", ) ) return ;
fclose(fp);
printf("Stage 4 clear!\n"); // network
int sd, cd;
struct sockaddr_in saddr, caddr;
sd = socket(AF_INET, SOCK_STREAM, );
if(sd == -){
printf("socket error, tell admin\n");
return ;
}
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons( atoi(argv['C']) );
if(bind(sd, (struct sockaddr*)&saddr, sizeof(saddr)) < ){
printf("bind error, use another port\n");
return ;
}
listen(sd, );
int c = sizeof(struct sockaddr_in);
cd = accept(sd, (struct sockaddr *)&caddr, (socklen_t*)&c);
if(cd < ){
printf("accept error, tell admin\n");
return ;
}
if( recv(cd, buf, , ) != ) return ;
if(memcmp(buf, "\xde\xad\xbe\xef", )) return ;
printf("Stage 5 clear!\n"); // here's your flag
system("/bin/cat flag");
return ;
}

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

还是不太明白,这题在搞什么

pwnable input2 之 write up的更多相关文章

  1. pwnable.kr input解题记录

    pwnable input解题记录 给了源码如下: #include "stdio.h" #include "unistd.h" #include " ...

  2. pwnable.kr详细通关秘籍(二)

    i春秋作家:W1ngs 原文来自:pwnable.kr详细通关秘籍(二) 0x00 input 首先看一下代码: 可以看到程序总共有五步,全部都满足了才可以得到flag,那我们就一步一步来看 这道题考 ...

  3. 【pwnable.kr】input

    这道题是一道一遍一遍满足程序需求的题. 网上其他的题解都是用了C语言或者python语言的本地调用,我想联系一下pwntools的远程调用就写了下面的脚本, 执行效果可以通过1~4的检测,到最后soc ...

  4. pwnable.kr之input

    连接到远程服务器:ssh input2@pwnable.kr -p2222 查看题目所给的代码,根据题目的要求我们要给出所有符合条件的输入才能拿到flag,本来想在输入上动点歪脑筋,结果输入有字节数的 ...

  5. pwnable.kr的passcode

    前段时间找到一个练习pwn的网站,pwnable.kr 这里记录其中的passcode的做题过程,给自己加深印象. 废话不多说了,看一下题目, 看到题目,就ssh连接进去,就看到三个文件如下 看了一下 ...

  6. pwnable echo2

    pwnable echo2 linux 32位程序 涉及FSB和UAF漏洞的利用,先%x泄露地址,然后利用UAF漏洞进行利用 code:

  7. pwnable.kr-bof

    .Nana told me that buffer overflow is one of the most common software vulnerability. Is that true? D ...

  8. pwnable.kr-collision

    题目: 链接后登陆 ssh col@pwnable.kr -p2222 查看文件以及权限 Ls –al 查看代码 cat col.c 根据 if(strlen(argv[1]) != 20){ pri ...

  9. pwnable.kr-fd

    题目: 链接登录: ssh fd@pwnable.kr -p2222 查看文件及权限: ls –al 看到flag文件,但是当前用户fd并没有读权限. cat fd.c 分析程序: int argc ...

随机推荐

  1. windows环境下使用virtualenv对python进行多版本隔离

    最近在用python做一个文本的情感分析的项目,用到tensorflow,需要用python3的版本,之前因为<机器学习实战>那本书的缘故,用的是python2.7.所以目前的情况是要两个 ...

  2. Android的UI调优

    对于一个App的UI而言,在流畅性上的改进目标其实就是降低屏幕绘制的延迟,创建流畅和稳定的帧率以避免卡顿. 在理想情况下,全部的测量.布局和绘制的时间最好在16ms以内,这样才能保证屏幕运行的顺畅性. ...

  3. thinkphp3.2.3 版本使用redis缓存添加认证

    我在使用thinkphp3.2.3的时候 发现如果是使用redis缓存 设置了认证的redis能连接成功 却无法 set 操作 ,检查发现是没有认证导致的  $redis->auth这一步没有, ...

  4. 【T-SQL进阶】03.执行计划之旅-1

    到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. T- ...

  5. 针对Oracle数据库表中的数据的常见操作

    1.查询表中所有数据 select * from 表名; 例:select * from stu; 2.查询的同时修改表中数据 select * from 表名  for update; 例:sele ...

  6. vue 基础-->进阶 教程(3):组件嵌套、组件之间的通信、路由机制

    前面的nodejs教程并没有停止更新,因为node项目需要用vue来实现界面部分,所以先插入一个vue教程,以免不会的同学不能很好的完成项目. 本教程,将从零开始,教给大家vue的基础.高级操作.组件 ...

  7. WPF 杂谈——Trigger触发器

    笔者在使用的WPF过程中,见过的触发器有三种:Trigger.DataTrigger.EventTrigger.其中最为常用的要属Trigger.至于触发器的作用就是当某个属性的值发生变化,应该去做某 ...

  8. 关于python下安装PIL库遇到的问题及解决办法

    关于python下安装PIL库遇到的问题及解决办法 关于python下安装PIL库遇到的问题及解决办法 :在下面这个网址下载pipllow(a replacement for PIL) www.lfd ...

  9. input标签在只允许输入数字的时候添加的代码

    oninput="this.value=this.value.replace(/\D/g, '')"

  10. JS,HTML,CSS

    HTML定义了网页的内容 CSS定义了网页的布局 JavaScript定义了网页的行为