Pwn

pwnable.kr(fd)

Posted on 2020-01-02,2 min read

首先ssh连接服务器

看下有什么文件

有三个文件。我们能执行fd文件,查看fd.c。但是看不了flag。
fd是fd.c编译的程序。通过fd去查看flag

fd.c源码如下
#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;

}

分析下程序:

定义了32字节大小的buf
main函数:
    1.argv是否<2

    2.fd=atoi(argv[1])-0x1234
    这句是什么意思呢。atoi函数用来转换整数,如果失败,则返回零
    1admin->1
    admin->0

    3.len=read(fd,buf,32)
    read(fd,buf,32)
    参数分别是:文件描述符,变量,读取长度
    文件描述符是个啥呢
    文件描述符	通道名	
    0	stdin	标准输入
    1	stdout	标准输出
    2	stderr	标准错误
    
    4.strcmp("LETMEWIN\n",buf)
    比较buf。也就是上面我们read的值。是否等于LETMEWIN\n,一样就输出flag

现在理一下思路
argv传参。转换整数-0x1234,再放入read函数,输入-LETMEWIN\n
构造一下PAYLOAD,将argv传入4660,然后-0x1234=0
read(0,buf,32),再输入LETMEWIN\n,就能拿到flag了

下一篇: 看雪学院(汇编学习)→