0x00 背景
今年SCTF上的一道PWN题,难度还行,关键是要大概读懂程序,找到可利用的漏洞。由于比赛环境使用的是libc2.23,我为了复现也搞了一个ubuntu16.04的虚拟机(也是libc2.23)。这样搞fastbin利用比较方便。最后在libc的小版本上还是有一点出入,不过,问题不大。
0x01 源码分析
整个main函数的大致逻辑如下,一个42*62的二维数组保存整个游戏区域。依据输入的方向键改变蛇移动的方向。碰到边界后游戏结束。打印分数,并可以留言。然后就进入了喜闻乐见的菜单界面。
while ( 1 )
{
v10 = 0;
v13 = 60;//起始y坐标
v14 = 4;//起始x坐标
v11 = 0;//y方向的速度
v12 = 1;//x方向的速度
dword_603120 = 0;
memset(ptr_togame_area, 0, 0xA2CuLL);
sub_4012D7((__int64)ptr_togame_area);
while ( 1 ) // in_the_game
{
sub_40142A(&v13, &v14, &v11, &v12);
sub_400EBA((__int64)&v16, dword_603120 + 1, &v13, &v14, (__int64)ptr_togame_area);
printf("player name: %s \t score: %d\n", buf, (unsigned int)dword_603120);
v15 = sub_401560(v13, v14, (__int64)ptr_togame_area, &v11, &v12);
if ( v15 )
break;
v7 = ptr_togame_area;
if ( v7[(signed int)sub_400E87(v13 + v11, v12 + v14)] == 97 )
{
++dword_603120;
sub_4010E0();
}
else
{
sub_401375();
usleep(0x11170u);
sub_400EA4();
}
}
v15 = 0;
printf(