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