x86-64位的格式化字符串漏洞

在 x64 体系中,多数调用惯例都是通过寄存器传递参数。在 Linux 上,前6个参数通过 RDIRSIRDXRCXR8R9 传递。

简介

还是前面的程序编译成64位的

#include <stdio.h
int main()
{
    int n_change = 1;
    char str[200];
    printf("before is : %d\n", n_change);
    scanf("%s",str);
    printf(str);
    printf("\nafter is : %d\n", n_change);
    return 0;
}

使用 AAAAAAAA%p.%p.%p.%p.%p.%p.%p.%p.%p.%p. 作为输入

x86-64位的格式化字符串漏洞

x86-64位的格式化字符串漏洞
可以看到最后的输出中,前面的输出取自于寄存器,后面的才是取自于栈。虽然我们并没有向相应寄存器中放入数据,但是程序依旧会按照格式化字符串的相应格式对其进行解析。

真题

链接: https://pan.baidu.com/s/1H4t7JEFyitMCOtIFTtBswA 密码: do0d
2017 年的 UIUCTF 中 pwn200 GoodLuck
这个题目需要本地有flag.txt文件,所以我们自己新建一个就好。

x86-64位的格式化字符串漏洞
开启NX保护和部分RELRO保护。
IDA下F5,非常明显的格式化字符串漏洞
x86-64位的格式化字符串漏洞
gdb调试看看偏移位置,在第一个printf()即格式化字符串漏洞处下断点。

x86-64位的格式化字符串漏洞

x86-64位的格式化字符串漏洞

看到偏移为4,并且fmt 字符串存储在 RDI 寄存器中,所以 fmt 字符串对应的地址的偏移为 10。
所以我们只需要输入 %9$s 即可得到 flag 的内容。
当然可以借助现有的工具,这里介绍一个https://github.com/scwuaptx/Pwngdb 中的 fmtarg来确定栈上的变量偏移,注意一个是Pwngdb一个是pwndbg。如何与pwndbg配置请看这一篇文章https://blog.csdn.net/weixin_43092232/article/details/105648769

x86-64位的格式化字符串漏洞

x86-64位的格式化字符串漏洞

参考

本文章首发在 网安wangan.com 网站上。

上一篇 下一篇
讨论数量: 0
只看当前版本


暂无话题~