skills

  • 有read函数最好用send,scanf和gets必须用sendline
  • init函数也要查看,有时候一些变量的初始化就在其中
  • strlen的绕过:strlen()函数C语言0x00在无符号数组使用中,只读取0x00前面的长度,因此输入\x00绕过
  • password是通过 /dev/urandom 来⽣成的,所以是完全随机,所以第⼀个字节也有可能是‘\00’,⽽strcmp是匹配到‘\00’结束,所以我 们只需要输⼊‘\00’去爆破即可
  • 经常犯的一个错误就是,想要泄露栈上的内容,但是如果调用了一个函数后栈上内容会改变,我们应当先跑进这个函数里面再看栈的内容
  • 有时候gdb发现invalid address在read函数处,可能是因为忘记sh.send所以卡在了read函数处
  • 格式化字符串的时候有时候想看输出,可以用个pause
  • 当程序中没有输出函数的时候(泄露不了Libc),可以考虑打ret2syscall,要注意程序中无法反汇编的地方,可能就是题目想给你的gadgets
  • 当一次read不够用时,可以构造rop链多次read
  • scanf(不管是%d还是%s)必须要用sendline,因为scanf遇到空格或者\n才停止读取;read一般都用send,避免\n的覆盖
  • 每次如果别人的read函数是自定义的,注意最末尾的处理 比如这个就是要么大于输入长度,要么遇到\x0a停止,并且这个结束的位置会变成\x00,要注意有没有被覆盖,进行适当的处理
  • dbg的时候可以用pause避免错过
  • gdb -c core注意core文件在哪
  • 有溢出的情况下要仔细查看溢出的长度
  • 一开始堆块不干净可以通过add等操作把堆块变干净方便做题
  • 有时候ida反汇编会出错,觉得需要判断的地方看汇编代码
  • 逆向有很多中有时候会有msg类似的结构体,需要逆向出结构体
  • 有时候需要交互过后才能seccomp-tools才能检测出sandbox,可以这样p=process([“seccomp-tools”,‘dump’,’./pwn’])
  • 没给libc说明不需要,甚至不需要泄露,因为要留意题目中的后门