pwn学习资料整理——(一)pwn基础

为了深入学习PWN,此文章仅作为个人参考


工具

IDA、 gdb、 objdump、 ldd、 ncat、 msf-pattern_create、 checksec、 readelf、ropper、one_gadget、LibcSeacher、main_arena_offset

ncat 启动脚本进行端口监听

ncat -vc ./xxxxx -kl 127.0.0.1 8888
ncat -vc ./xxxxx -kl ::1 8888

objdump

objdump -M intel -D ./xxxxx

创建循环字符串

msf-pattern_create -l 10
Aa0Aa1Aa2A

gdb 命令

命令(缩写)	功 能
run(r)	启动或者重启一个程序。
list(l)	显示带有行号的源码。
continue(c)	让暂停的程序继续运行。
next(n)	单步调试程序,即手动控制代码一行一行地执行。
step(s)	如果有调用函数,进入调用的函数内部;否则,和 next 命令的功能一样。
until(u)
until location(u location)	当你厌倦了在一个循环体内单步跟踪时,单纯使用 until 命令,可以运行程序直到退出循环体。
until n 命令中,n 为某一行代码的行号,该命令会使程序运行至第 n 行代码处停止。
finish(fi)	结束当前正在执行的函数,并在跳出函数后暂停程序的执行。
return(return)	结束当前调用函数并返回指定值,到上一层函数调用处停止程序执行。
jump(j)	使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。
print(p)	打印指定变量的值。
quit(q)	退出 GDB 调试器。

gdb-peda


checksec // 查看文件的架构与保护机制开启状态

vmmap // 查看进程中的权限,以及起止地址

find

info file  // 查看当前文件的信息,例如程序入口点

info break // 查看当前断点信息

disassemble + func // 对指定的函数进行反汇编

break +''地址''  // 设置断点

r(run)  // 运行程序

c(contunue)  // 继续执行

x / (n , f ,u) // n,f,u是其三个可选参数

	n:是正整数,表示需要显示的内存单元的个数,即从当前地址向后显示n个内存单元的内容,
	一个内存单元的大小由第三个参数u定义。
	
	f:表示addr指向的内存内容的输出格式,s对应输出字符串,此处需特别注意输出整型数据的格式:
		x 按十六进制格式显示变量.
		d 按十进制格式显示变量。
		u 按十进制格式显示无符号整型。
		o 按八进制格式显示变量。
		t 按二进制格式显示变量。
		a 按十六进制格式显示变量。
		c 按字符格式显示变量。
		f 按浮点数格式显示变量。

	u:就是指以多少个字节作为一个内存单元-unit,默认为4。u还可以用被一些字符表示:
	  如b=1 byte, h=2 bytes,w=4 bytes,g=8 bytes.

	<addr>:表示内存地址。
	例如: x/20xw $esp // 常用于x86打印esp地址向后20个内存单元,以4字节作为一个内存单元,以16进制显示
	      x/20xg $rsp  // 常用于x64查看

layout // 用于分割窗口,可以一边查看代码,一边测试。
主要有下面几种用法:

layout src // 显示源代码窗口

layout asm // 显示汇编窗口

layout regs // 显示源代码/汇编和寄存器窗口

layout split // 显示源代码和汇编窗口

layout next // 显示下一个layout

layout prev // 显示上一个layout

Ctrl + L // 刷新窗口

Ctrl + x  再按1 // 单窗口模式,显示一个窗口

Ctrl + x  再按2 // 双窗口模式,显示两个窗口

Ctrl + x  再按a // 回到传统模式,即退出layout,回到执行layout之前的调试窗口。

查询偏移量

msf-pattern_offset -q Aa2A
[*] Exact match at offset 6

查看进程加载的模块地址

pidof ./xxxxx
cat /proc/进程号/maps

一个程序

ELF Header
.init 
.plt
.text
.rodata
.got
.data
.bss

变量

rdi
rsi
rdx
rcx
r8d
r9d

各种防护措施

Stack Guard/canary
DEP/NX
ASLR
PIE
RELRO

Stack Guard/canary

做完function prologue的时候会将随机生成的乱数塞入stack中,
function return前会检查该乱数是否被更动过,
若发现更变就立即结束程式

DEP/NX

Data execution prevention
可执行的地方不能写,可写的地方不能执行
又称NX
可以防御之前说的在global变量部分写shellcode,然后修改rip进行执行

ASLR

Address Space Layout Randomization
每次程式执行时 stack、heap、library位置都不一样

PIE

Position Independent Execution
开启后,code 与 data 都会跟着ASLR

RELRO

Relocation Read-Only
Partial RELRO
· GOT 可写
Full RELRO
· Load time时会将所有function resolve完毕
· GOT 不可写

ROP

Return Oriented Programming
通过不断去执行包含ret的程式片段来达到想要的操作
这些包含ret的程式片段又被称作gadget

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!很高兴回答你的问题。关于软件安全实验二中的攻击方式Pwn,我可以为你提供一些基本的信息。Pwn是指通过利用软件漏洞来获取对计算机系统的控制权。在实验二中,你可能会学习和尝试使用缓冲区溢出漏洞、格式化字符串漏洞、堆溢出等技术来进行Pwn攻击。 缓冲区溢出是一种常见的Pwn攻击技术,它利用了程序在处理输入数据时没有正确限制长度的漏洞。通过向程序输入过长的数据,可以覆盖到程序运行时的内存空间中的其他重要数据,例如返回地址。通过修改返回地址,攻击者可以控制程序流程,执行恶意代码。 格式化字符串漏洞是另一种常见的Pwn攻击技术。它利用了C语言的格式化字符串函数(如printf、sprintf等)在处理格式化字符串时存在的安全问题。通过向程序输入特定格式的字符串,攻击者可以读取或修改内存中的数据,甚至执行任意代码。 堆溢出是利用堆内存管理中的漏洞进行攻击的一种技术。在使用动态分配内存时,如果没有正确地释放或管理内存,可能会导致堆溢出。通过在堆中溢出写入数据,攻击者可以修改关键数据结构,从而影响程序的执行逻辑。 以上只是Pwn攻击的一些基本概念,实际的Pwn攻击还涉及很多技术和细节。在进行任何Pwn攻击之前,请务必遵循法律和道德规范,并确保你在合法授权的环境中进行实验。 如果你有任何关于Pwn攻击或软件安全实验的具体问题,我会尽力为你解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值