CTF pwn题搭建的笔记

2018-04-25  本文已影响722人  SevenBy

1.准备好题
  题目需要自己搞好,比如最简单的一个pwn(stackoverflow):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
//#include "dump_stack.h"

void vuln(int tmp, char *str) {
    int win = tmp;
    char buf[64];
    strcpy(buf, str);
   // dump_stack((void **) buf, 23, (void **) &tmp);
    printf("win = %d\n", win);
    if (win == 1) {
        execl("/bin/sh", "sh", NULL);
    } else {
        printf("Sorry, you lose.\n");
    }
    exit(0);
}

int main(int argc, char **argv) {
    if (argc != 2) {
        printf("Usage: stack_overwrite [str]\n");
        return 1;
    }

    uid_t euid = geteuid();
    setresuid(euid, euid, euid);
    vuln(0, argv[1]);
    return 0;
}


2.gcc/g++编译
  这时候直接使用命令gcc pwn1.c -o pwn1是不行的,不信你试试~

./pwn1
1111111111111111111111
*** stack smashing detected ***: ./3 terminated
Aborted
#stack smashing是GCC的一种检测“缓存溢出”的保护机制

我们使用如下命令:

gcc -fno-stack-protector -z execstack -mpreferred-stack-boundary=4  -o pwn1 pwn1.c
#Ubuntu下面的GCC默认开启了Stack Smashing Protector,
#如果想在这个系统中学习缓冲区溢出的原理,在编译时要加上fno-stack-protector选项,
#否则运行时会出现*** stack smashing detected ***: xxx terminated,
#而不是期望的Segmentation fault。同时还需要加上允许栈执行的选项。

#-fno-stack-protector用来关闭gcc编译器gs验证码机制
#-z execstack用来关闭ld链接器堆栈段不可执行机制

3.关闭地址空间随机化(ASLR)
  首先确认系统中ASLR是否打开,cat /proc/sys/kernel/randomize_va_space,如果结果为2,则ASLR开启。
  关闭方法:sudo echo 0 > /proc/sys/kernel/randomize_va_space,即将randomize_ca_space文件内数字置0即可。

接下来,就随便浪去吧……~

2017年4月19日08:23:12,补充:额,可能是我当时写的时候比较赶,后面部分可能忘记写了……
如果你想将题目挂载在服务器的端口,socat工具真的很方便:

sudo apt-get install socat
socat tcp-l:端口号,fork exec: filepath &

另外,如果你想你的程序即使关闭虚拟终端也可以运行的话,使用nohup命令

#首先编写一个.sh脚本
#!/bin/sh
#name:pwn1.sh
socat tcp-l:9999,fork exec:./pwn1
上一篇下一篇

猜你喜欢

热点阅读