首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用pwntools正确捕获进程的输出

如何使用pwntools正确捕获进程的输出
EN

Stack Overflow用户
提问于 2020-03-18 21:38:18
回答 1查看 5.4K关注 0票数 1

目前,我很困惑如何使用python3的pwntools库来利用程序--主要是将输入发送到易受攻击的程序中。这是我当前的python脚本。

代码语言:javascript
复制
from pwn import *
def executeVuln():
    vulnBin = process("./buf2", stdin=PIPE, stdout=PIPE)
    vulnBin.sendlineafter(': ','A'*90)
    output = vulnBin.recvline(timeout=5)

    print(output)

executeVuln()

下面是我试图利用的程序--这不是关于如何利用程序,而是更多地介绍如何使用脚本来正确地自动化它。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

#define BUFSIZE 176
#define FLAGSIZE 64

void flag(unsigned int arg1, unsigned int arg2) {
  char buf[FLAGSIZE];
  FILE *f = fopen("flag.txt","r");
  if (f == NULL) {
    printf("Flag File is Missing. Problem is Misconfigured, please contact an Admin if you are running this on the shell server.\n");
    exit(0);
  }

  fgets(buf,FLAGSIZE,f);
  if (arg1 != 0xDEADBEEF)
    return;
  if (arg2 != 0xC0DED00D)
    return;
  printf(buf);
}

void vuln(){
  char buf[BUFSIZE];
  gets(buf);
  puts(buf);
}

int main(int argc, char **argv){

  setvbuf(stdout, NULL, _IONBF, 0);

  gid_t gid = getegid();
  setresgid(gid, gid, gid);

  puts("Please enter your string: ");
  vuln();
  return 0;
}

这个过程开得很好。发送后块,直到发送行,因此,如果不匹配,它将无限期地等待。但是,它运行良好,因此应该发送输入。输出应从recvLine获得90A,原因是

puts(buffer)输出输入字符串。

然而,返回的所有内容都是b'',它似乎表明易受攻击的程序没有接收到输入并返回空字符串。

有人知道是什么导致的吗?

EN

回答 1

Stack Overflow用户

发布于 2021-10-20 04:14:21

使用上面的程序,我得到了print(output)作为b'\n' (而不是b''),这是对它的解释。

puts()语句在末尾输出一个newline字符,而不是由sendlineafter()调用读取,这将导致下面的recvline()打印b'\n'读取偏离的newline字符。

为什么newline字符不是由sendlineafter()读取的?因为sendlineafter()只是recvuntil()sendline()的组合,recvuntil()只在delimiter之后读取字符。(pwntools文档)

因此,解决方案是用下面的sendlineafter()读取换行符(或者通过调用recvline()两次),

代码语言:javascript
复制
from pwn import *

def executeVuln():
    vulnBin = process("./buf2", stdin=PIPE, stdout=PIPE)
    vulnBin.sendlineafter(b': \n',b'A'*90)
    output = vulnBin.recvline(timeout=5)

    print(output)

executeVuln()

输出:

代码语言:javascript
复制
[+] Starting local process './buf2': pid 3493
[*] Process './buf2' stopped with exit code 0 (pid 3493)
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n'

注意:--我在sendlineafter()中以字节的形式添加了字符串,以删除下面的BytesWarning

代码语言:javascript
复制
program.py:5: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
  vulnBin.sendlineafter(': \n','A'*90)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60747839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档