小知识点:
-
一般来说,我们写main函数,就定义main(),它的参数部分看似没有,实际上,main函数也是有参数的,只是在我们写时省略了。
main函数的参数由三部分组成,分别是argc(int型,表示命令行参数的个数)、argv[](char数组型,指向命令行的每一个命令参数)、envp[](char数组型,指向环境变量)。
说明:argc包括程序本身,所以它大于等于1。argv以NULL结尾,且也包括程序本身,所以它的元素个数大于等于2。
—摘自https://blog.csdn.net/smell201611010513/article/details/80130941 -
(unsigned_int8) 这是一个强制转换的符号,意思是强制转成一个字节大小。
-
gdb脚本的学习
gdb参考学习:https://www.xuebuyuan.com/3193223.html
解题点:找出摆放正确数组的盒子。(就是正确的数组罢了)
吐槽:
题目漏了给关键提示:
$ ./reverse_box ${FLAG}
95eeaf95ef94234999582f722f492f72b19a7aaf72e6e776b57aee722fe77ab5ad9aaeb156729676ae7a236d99b1df4a
flag格式:TWCTF{}
原题的提示,解题关键点。
涉及到一些知识点,一些没见过的操作等。
看到rand,发现只是伪随机数,把这些dump出来就行了。
根据flag的特征,TWCTF{}进行爆破。
emmm,查看给出的hint,要求输出的第一个是95,
因为对应的代码是输出的是%x 十六进制形式。
所以要爆破第一个95,那就好办了。
因为flag的格式第一个是TWCTF,第一个就是T,对应的是95,
找出内置的盒子就ojbk了。
使用gdb脚本,借鉴大佬的。
-PS:为什么想到会一定有一个对应的正确盒子?
因为想想,无论随机数是啥,输入正确flag都会输出对应那一条密码,
那么,很容易联想到,这是一个伪随机数,中间夹着一大段操作是寻找不同的盒子,
当flag正确,无论哪一个随机数都会对应正确盒子所在地,那么就很好解释了,也只是猜想,
反正没啥思路,就按这个做,结果是对的。(猜想有重复的话,就试试下一个,这样子)
emmm,明天再搞搞。–9.10
经过一段摸索,发现应该几种解法。
- 一种是直接写IDA脚本提取出来,这种还没弄懂
- 一种就是直接写脚本模拟盒子的数的生成,然后再一个一个去挑选,(这个比较好理解)
- 一种就是上面说的gdb脚本了,这个脚本一开始肯定想不到了,因为学的太少了,先模仿,再学会。
理解的关键就是看懂流程。
在gdb中用define就可以写下面的脚本了,
也可以写在另一个文件中,用source引入即可。
set $i=0
set $total=256
while($i<$total)
b *0x80485b4
b *0x8048704
run T
set $i=$i+1
set *(char*)($ebp-0xc)=$i
continue
if ($eax==0x95)
print $i, $i
x/256xb $esp+0x1c
set $i=256
end
stop
end
cao的脚本,因为对gdb不是太熟悉,理解一下。