「TSCTF-J_2021」Pwn - Int_Or_Char WriteUp
· 阅读需 5 分钟
题目
初步确定思路
使用checksec
查看一下文件,发现并没有开启NX和PIE,则初步考虑ret2text和ret2shellcode
分析代码
直接跳到pwn()
函数开始看吧
int pwn()
{
char s[50]; // [esp+Dh] [ebp-3Bh] BYREF
unsigned __int8 v2; // [esp+3Fh] [ebp-9h]
puts("Plz input ur passwd:");
puts("Tip: The passwd length needs to be between 4 and 8 characters");
gets(s);
v2 = strlen(s);
return check(v2, s);
}
注意到gets(s)
并没有限定长度,可以考虑在这里栈溢出。
来到check(v2, s)
函数
char *__cdecl check(int a1, char *src)
{
if ( (unsigned __int8)a1 <= 3u || (unsigned __int8)a1 > 8u )
{
puts("So bad!");
puts("The passwd length needs to be between 4 and 8 characters");
exit(0);
}
puts("good length!");
return strcpy(passwd_buf, src);
}
这里要求我们的长度a1 > 3 && a1 <= 8
,如果是这样的话我们很明显无法构造出我们想要的payload, 这里可以参考攻防世界的Int_Overflow的writeups提到的整数溢出漏洞
一个通俗易懂的C语言例子
对于一个
2字节的unsigned short int型变量
,当它的数据长度超过2字节时,就会溢出,使用的数据也仅仅是最后两个字节int main()
{
unsigned short int var1 = 1, var2 = 257; //var1 = 0x
if (var1 == var2)
{
printf("溢出");
}
return 0;
}