1

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

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

    print(output)

executeVuln()

我正在尝试利用的程序如下 - 这不是关于如何利用该程序,而是关于使用脚本正确地自动化它。

#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;
}

该过程打开正常。sendlineafter 阻塞,直到它发送该行,因此如果它不匹配它会无限期地等待。但是,它运行良好,因此应该发送输入。由于以下原因,输出应从 recvLine 接收 90 A

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

但是,返回的只是 b'',这似乎表明易受攻击的程序没有接收输入并返回空字符串。

有谁知道这是什么原因造成的?

4

1 回答 1

0

使用上述程序,我得到了print(output)as b'\n'(not b''),这是对它的解释。

puts()语句newline在末尾输出一个字符,sendlineafter()调用不会读取它,这反过来又会导致newline下面的recvline()打印读取杂散字符b'\n'

为什么newline字符不被读取sendlineafter()?因为这sendlineafter()只是 and 的组合recvuntil()sendline()其中recvuntil()只读取直到delimiter留下字符。(pwntools 文档

所以解决这个问题的方法是读取换行符,sendlineafter()如下所示(或调用recvline()两次),

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()

输出:

[+] Starting local process './buf2': pid 3493
[*] Process './buf2' stopped with exit code 0 (pid 3493)
b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n'

注意: 我将字符串添加为字节sendlineafter()以删除以下BytesWarning.

program.py:5: BytesWarning: Text is not bytes; assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
  vulnBin.sendlineafter(': \n','A'*90)
于 2021-10-20T04:14:21.170 回答