通过这道题的学习与收获有:

1、分析这种漏洞比较明显的题目,应该倒推程序逻辑,而且程序最后给出了system(command),而command又是个地址(指向我们所输入的内容),此时应该很容易想到,我们输入/bin/sh就可以执行。但是我开始没有想到这一点… 还是做的少。

2、考察了linux下命令行多命令执行的特定。如果命令被;分开,即使前面的命令执行错误也依旧会执行后面的命令。

3、u32可以一次转四个字符为对应ASCII码,返回值为int类型。

4、当格式化字符为%d时,我们想存入字符串,应该输入对应其ASCII。

5、这道题又是地址又是*地址的,开始容易搞迷糊,应该仔细捋一下。

阅读全文 »

通过这道题的学习与收获有:

1、close 关闭了标准输出时,可以用格式化字符串漏洞来将stdout指向的内容修改成IO_2_1_stderr,让程序重新有回显,关于这个过程我画了张图方便自己理解。

2、已经拿到libc基地址的时候,我们所需要的gadget就可以直接去libc中拿,libc里啥都有,libc里啥都有,libc里啥都有,重要的事情说三遍!

3、写爆破脚本时,感觉会报错的地方,用try和except预判一手,让程序得以继续重新运行,而不是原地崩溃。

4、如果close(1)关闭了标准输出,那么格式化字符串漏洞的写入数据最多只能写入0x2000字节,程序如果执行了setvbuf,stdout会出现在bss段,反之则会在libc库中。

阅读全文 »

通过这道题的学习与收获有:

1、strlen函数是可以被00给截断的,而shellcode本身执行的时候并不会因为00截断。

2、第一次手写open,read,write函数的汇编

3、push一个字符串的话,比如push 0x67616c66 (这个是flag),不足八字节,push的时候会自动填充00补全八字节,从而占满一个内存单元。

阅读全文 »

通过这道题的学习与收获有:(说实话,我把这玩意拖到IDA里的一刻,我是想直接把它扔进回收站的,不过最终还是硬着头皮做下来了,收获也真的很多)

1、这道题的漏洞点是数组下标的不检查,导致char类型可能自身变成负数,使得我们可以输入不正常数据来通过对flag的检查。

2、使用单字节爆破的手段,获取flag,这道题对于flag的检查是判断整体的,但之所以可以进行单字节爆破是因为我们是先通过了flag的检查,然后依次改变一字节,来观察回显,我们的flag是否正确,从而进行单字节的爆破。并且还有一个前提是不限次数的输入内容(只要内容是100字节,就可以与flag进行比较判断)

3、当时关于本机的flag和远程的flag这里迷了好久,我一直以为本机的是假flag,然后远程是通过某种加密手段放的是真flag(意思就是说本机flag和远程flag我感觉应该是有关系的),最后看了下前面的英文提示,又想了很久最后发现,这俩flag之间并没有任何关系…

4、我们始终都没法直接控制value_1和value_2的值,我们仅仅只能去控制bin_by_hex数组的索引,而我们爆破的其实是bin_by_hex数组的下标,而真正的flag是通过这个下标去数组bin_by_hex里面找到真正flag的所对应的字符。之所以给我们一种爆破flag的错觉其实是因为爆破的bin_by_hex数组下标正好又是对应字符的ascii(比如我爆破b的时候,分别发了6和2,这个0x62其实是bin_by_hex的下标,但是这个下标放的又正好是b)因此就感觉我们在爆破flag一样。关于这个bin_by_hex数组与它的下标这里,我迷了很久。

5、这道题最后的爆破脚本我感觉还是需要一些python功底才能写出来的(我是看了下师傅们的 exp才写出来的)

6、这道题最恶心的地方就是调试很麻烦(其实我压根就不会…),而且对于这道题调试而言的话,也不知道调试该看什么,又是要连接的,又是fork的,确实不会调…

7、熟悉了一下常见网络编程函数的功能,用IDA简单对他们进行了流程的分析。

阅读全文 »

使用one_gadget的时候,必须要满足一定条件,如果所有one_gadget都没有满足条件,那么我们可以使用realloc函数来调整栈帧打one_gadget。本文以2.23的libc版本中的realloc函数举例说明使用realloc函数是如何调整栈帧打one_gadget的,但是在不同的libc版本中,realloc函数的具体汇编代码也不同,就导致了从在不同libc版本中的realloc函数的相同偏移处开始执行,最终调整的栈帧也是不同的,因此在实际的做题中,去一个一个尝试偏移会比计算出能使one_gadget生效的realloc函数偏移更快。

阅读全文 »

这次比赛由于本人较菜,只做出了一道格式化字符串的那道题(比赛24个小时,这道题我打了18个小时,是真菜),在知道roderick师傅三小时做了四道题之后,就感觉自己更菜了 o(╥﹏╥)o 然后由于堆题的libc版本都很高,所以暂时先没打算复现(主要菜狗才刚把低版本libc的堆基础漏洞学完)

阅读全文 »