有一类题目,不会给任何文件,只给一个ip和端口,这种称为blind pwn(盲pwn),如果这类pwn存在格式化字符串漏洞的话,可以通过一些手法拿到整个二进制程序,这对我们的逆向分析和解题是十分重要的,举个例子:
在2022年的Insomni’hack teaser比赛上,有一道题CovidLe$s,就是一道盲pwn,输入什么就回显什么,但是存在格式化字符串漏洞,并且应该是栈上的,通过不断的尝试是可以大致猜测出栈结构的:
从偏移12开始是栈上的缓冲区,29那里是canary,31是返回地址,根据后三位可以猜到libc大版本
但是到这里也就结束了,无法继续推进了,此时就需要用到接下来将要介绍的方法,将整个程序dump下来才能继续分析
首先来看看dump下来的文件:
可以看到虽然不是很完整,但是大致的逻辑结构是能看到的,如果不dump下来的话,就不可能拿到这道题目的密钥,也就不可能做出来这道题,所以有些时候dump文件是必要的
dump的原理其实也很简单,其实就是利用格式化字符串的%n$p这类指令进行任意地址读
由于比赛已经结束,端口已经关闭,所以我们来自己写一个小demo:
#include<stdio.h>
#include<stdlib.h>
int main()
{
setbuf(stdin, 0LL);
setbuf(stdout, 0LL);
setbuf(stderr, 0LL);
char s[0x100];
memset(s,0,0x100);
while(1)
{
read