StackOverflow
LINUX Stackoverflow学习笔记
CTF PWN的学习资源过于零散,此文用于整合一些学习所得
原理相关
函数调用栈:
CTFwiki中关于栈原理的介绍 这其中包含了对函数调用栈的介绍以及x86与x64的区别
栈溢出原理:
CTFwiki关于栈溢出原理的介绍 包含了对栈溢出的基本介绍
前置知识与技术
IDA的使用 GDB(peda、pwndbg)的使用 linux使用基础 elf文件结构 gadgetROP指令
PWN前处理
首先使用==checksec==来确认二进制文件开启保护的情况
1 | |
可得到程序位数,保护机制等信息。
1 | |
用于打开文件执行权限。
基本ROP-多种状况的应对方式
总参考:CTFwiki-基本ROP
1.ret2text
最简单的情况。 程序中有现成的控制语句,可以直接利用栈溢出覆盖ip来控制程序跳转。
留坑
有PIE保护的情况
[NISACTF 2022]ezpie 对应题解 此题就开启了最简单的PIE保护。
架构不同的情况 需要注意的是,题目可能会有64位与32位两种架构,这两种架构的地址长度不同,导致payload的差别。在其他情形中,也可能出现该状况,请注意。 需要栈对齐的情况
在Pwn中,为什么时常需要栈对齐? 其中包含了例题,对栈对齐的简洁介绍以及应对方式。
栈对齐不仅在ret2text中会遇到,在其他类型中亦可能出现。之后不再赘述 最简单的方式便是,在pwn不通时,便加上汇编ret指令的地址进行尝试。 需要栈对齐的情况通常是运行system函数时。 可能的困惑:为何加了ret程序仍能够正常进行?这是因为ret的效果包括了pop rdi,这会将栈顶地址再次赋予rip,从而运行栈顶所指的语句。 开启了Canary保护的情况
例题:[2021 鹤城杯]littleof 题解:【PWN · ret2libc | Canary】[2021 鹤城杯]littleof 理解此题需要一定的格式字符串漏洞知识。
2.ret2shellcode
例题简介 关注此文前半段关于原理的概述即可。 在此将获取权限的shellcode贴出以供使用: ==\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05==(请注意:这种方法未经论证,本人在少量样本中都取得了成功,如有错误,请您指正!) 或者直接定义context,使用
1asm(shellcraft.sh())进行生成,但是在[GDOUCTF 2023]Shellcode中失败了,尚未知晓原因。 补充:原因已查明,参见[GDOUCTF 2023]Shellcode 全网最详细write up
3.ret2syscall
留坑
4.ret2libc
较为复杂的情形
原理请参照wiki [CISCN 2019东北]PWN2一道非常典型的ret2libc
这种类型常常没有现成的system与bin/sh可用,但是往往在可溢出语句前运行了libc函数,因此需要用libc函数的真实地址确定服务器使用的libc版本,从而获取libc基址与system函数及bin/sh的偏移量,从而达到目的。