BUUCTF_jarvisoj_guess
通过这道题的学习与收获有:(说实话,我把这玩意拖到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简单对他们进行了流程的分析。