首页 > 其他分享 >格式化字符串

格式化字符串

时间:2024-02-21 21:14:57浏览次数:31  
标签:格式化 写入 len flag 字符串 x00 泄露

泄露栈的内存,泄露任意地址内存

修改栈的内存,修改任意地址内存

\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是写入四个字节

内容位于栈上泄露

ez_fmt

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为偏移量

利用栈链改变栈上的值

image-20240208210909755 用%p*n代替的$的偏移

改动时还需要注意原来的值

标签:格式化,写入,len,flag,字符串,x00,泄露
From: https://www.cnblogs.com/Anike/p/18026206

相关文章

  • PHP 字符串拼接性能大比拼
    三种方式:直接用.来进行连接。用.=进行连接。先压入数组,再通过join函数连接。<?phpfunctionget_tm(){list($usec,$sec)=explode("",microtime());return((float)$usec+(float)$sec);}$temp="test";$num=100000;#define("num"......
  • 常用字符串算法
    KMP我们考虑朴素的字符串匹配过程。voidmatch(conststring&s,conststring&p){//findpinsfor(inti=0;i<s.size();++i)for(intj=0;j<p.size()&&i+j<s.size();++j){if(s[i+j]!=p[j])break;if(......
  • 【C++】判断回文字符串。回文指的是顺读和逆读都一样的字符串。例如,“tot”和“otto”
    //判断字符串是否是回文字符串(考虑大小写,空格和标点符号)boolpalindrome1(string&str){stringret;for(auto&c:str){if(isalpha(c)){if(isupper(c)){ret.push_back(tolower(c));}else{ret.push_back(c);}......
  • delphi按键值对重组字符串
    问题背景:有一组基金代码串,原逻辑按基金代码单个调整为按父子基金代码组作为条件获取查询结果解决原理:采用TStringList类哈希表操作方式重组字符串List:=TStringList.Create;List.Add('aaa=111');List.Add('bbb=222');List.Add('ccc=333');List.Add('ddd=444');ShowMessag......
  • 十六进制字符串,转化为十六进制数据并write 写出去
    如果你想使用write函数以十六进制方式发送数据,你需要将十六进制数据转换为字节,并将字节作为参数传递给write函数。下面是一个示例程序,演示如何将十六进制字符串转换为字节,并使用write函数发送数据:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<st......
  • redis自学(1) 动态字符串SDS
      字符串是redis最常见的数据结构,但redis并没有直接使用C语言的字符串,是因为C语言本身其实是没有字符串的,所谓的字符串其实是字符数组(Java语言中的字符串是一个对象),所以C语言的字符串有很多问题:①获取字符串长度需要通过运算C语言的字符串数组都是以’\0’结尾,这是一个字符......
  • 2024-02-20 随机生成30位字符串
    functiongenerateRandomString(){letspecialChars="`~!@#$%^&*-+=_|{}[]:;'<>,.?/";letlowercaseLetters='abcdefghijklmnopqrstuvwxyz';letuppercaseLetters='ABCDEFGHIJKLMNOPQRSTUVWXYZ';let......
  • chapter4-字符串
    记录字符串常考的4种操作:遍历、加密、统计、匹配。1.字符串介绍C++提供了字符串(string)这种基本数据类型,它可以很方便地对字符串进行各种操作。使用需要添加头文件#include<string>。1.1字符串的构造字符串的构造包括定义和初始化两个部分,定义一个字符串的方式和定义其他基本......
  • 统计字符串中出现次数最少的字符
    functiongetMinStr(str){constcountObj={}for(letiofstr){Reflect.has(countObj,i)?countObj[i]++:countObj[i]=1}constresult=Object.entries(countObj).reduce((pre,cur)=>cur[1]>pre[1]?cur:pre)ret......
  • Map判空 、空字符串、空key值等各种判断方法
    一、Map本身的判空1.1“==null”不能判断Map的本身是否为null  1.2map.isEmpty()判断为空当map没有向里面put数据的时候,可以利用map自带得方法来进行判断该Map是否里面有值 1.3“==null”与“isEmpty()”最大的区别如果map是一个null存在,那么在利用isEmpty()来判空将......