pwnable学习笔记-fd

概述

如果想学习pwn,可以从http://pwnable.kr/的练习入手,本文是第一个练习fd

题目描述

点击fd的图片进入题目,提示Linux文件描述符,同时告知连接靶机的方式ssh fd@pwnable.kr -p2222,密码为guest
在这里插入图片描述

解法

连接

通过ssh登录后,发现源代码fd.c和编译后的文件fd
在这里插入图片描述

Linux文件描述符

Linux的文件描述符如下。
在这里插入图片描述

源代码分析

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
 if(argc<2){
  printf("pass argv[1] a number\n");
  return 0;
 }
 int fd = atoi( argv[1] ) - 0x1234;
 int len = 0;
 len = read(fd, buf, 32);
 if(!strcmp("LETMEWIN\n", buf)){
  printf("good job :)\n");
  system("/bin/cat flag");
  exit(0);
 }
 printf("learn about Linux file IO\n");
 return 0;

}

可以看出:

  • fd程序要求一个参数
  • 这个参数经过atoi()函数转为整型后会和0x1234比较
  • 如果要得到flag,需要在strcmp()中buf的结果与LETMEWIN相等

在函数read()中,fd代表文件句柄,需要使fd为0,这样函数read()就会从标准输入中读入内容,从而实现buf中的内容控制

解答

要使fd为0,需要<输入的参数>-0x1234=0,即输入0x1234,但不能直接输入16进制数,因为要经过atoi()函数的转换,如果直接输入0x1234,转换为结果为0,

在这里插入图片描述

因此需要先转成10进制

In [1]: int('0x1234',16)
Out[1]: 4660

在运行程序./fd 4660,输入LETMEWIN按回车即可
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值