StackOverflow

LINUX Stackoverflow学习笔记


CTF PWN的学习资源过于零散,此文用于整合一些学习所得

原理相关

函数调用栈:

CTFwiki中关于栈原理的介绍
这其中包含了对函数调用栈的介绍以及x86与x64的区别

栈溢出原理:

CTFwiki关于栈溢出原理的介绍
包含了对栈溢出的基本介绍

前置知识与技术

IDA的使用
GDB(peda、pwndbg)的使用
linux使用基础
elf文件结构
gadgetROP指令

PWN前处理

首先使用==checksec==来确认二进制文件开启保护的情况

1
checksec [filename]

可得到程序位数,保护机制等信息。

1
chmod 777 [filename]

用于打开文件执行权限。

基本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,使用

1
asm(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的偏移量,从而达到目的。

  • Copyrights © 2023-2024 Eleco
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信