reversing-enging-0x01

buffer overflow

HTB:You know 0xDiablos:bof.

Linux x86 内存结构

Linux x86 内存结构

一个函数被调用时,传递给此函数的参数(name-parameter)以及此函数的局部变量会被pushstack段的 栈顶。

当一个函数有多个入参时,会倒序pushstack段中,如funcA(1, 2, 3),会以 push(3);push(2);push(1)的方式pushstack中。

调用的函数(A)入栈后,应该持有一个地址,用于函数(A)执行完成后,继续运行的下一行 代码的地址(return address)。

全部内容入栈后,会将栈底指针EBP(extended base pointer)入栈,说明当前位置是栈底 。此处栈底的定义是针对入栈后正在运行的函数(A)而言的,因为,函数(A)的内部变量 也需要入栈,入的是以EBP为底的栈。

举例理解

1
2
3
4
5
6
void main() {
1 char buffer [256];
2 funcA(1, 2, 3);
3 otherStatement;
4 return;
}

当以上程序
执行1行时,buffer入栈。
执行2行时,作为入参(name-parameter):3入栈、2入栈、1 入栈;作为返回地址 (return address),下一行代码(3行)的地址入栈。
funcA函数相关信息入栈完毕,EBP入栈,标识此处是栈底。
椄下来是funcA内部变量,会以EBP作为栈底,入栈。
比较特殊的是,main函数的入参在kernel段中,而不是stack段。

以上程序stack段图

缓冲区溢出攻击过程

buffer溢出攻击过程就是栈溢出攻击过程。buffer在填充的时候,由低地址向高地址 填充。

buffer正常填充

buffer填充过量(溢出),就是栈溢出,当人为控制溢出的内容时,就是缓冲区溢出攻击

buffer溢出攻击

根据以上图,funcA执行完毕后,根据return addressname-parameter执行bad func了,而不是预计的funcA 的3行,这就是缓冲区溢出攻击


reversing-enging 0x00

Tools

  • file
  • ghidra
  • strings
  • ltrace
1
ltrace ./cmd
  • gdb

    with plugin pwndbg

    • info

      • i b

        info break,查看所有断点信息

      • i r

        info registers,查看各寄存器当前值

      • i f

        info function,查看所有函数名

    • show

      • show args

        查看参数

    • backtrace

      查看调用栈

    • 执行

      • run

        • r

          重新开始执行

      • s

        源码层面step into,一步

      • si

        汇编层面step into,一步

      • n

        源码层面step over,一步

      • ni

        源码层面step over,一步

      • c

        continue; continue step debug

      • starti

        自动run后断在程序入口处

    • piebase

      计算当前程序运行地址

    • piebase 0x1234

      计算当前程序运行地址+偏移量后的地址

    • 断点

      • break *0x1234

        0x1234地址处的指令打断点,*作取地址意

      • break +0x1234

        在当前位置下0x1234的位置打断点

      • breakrva 0x1234

        跟据piebase0x1234偏移量设置断点

      • delete 1

        删除1号断点;delete为删除所有断点

      • disable 2

        禁用2号断点;
        enable 2为启用2号断点

      • clear

        清除之后所有断点

    • jump *0x1234

      跳跃执行0x1234处的程序

    • 缓冲区溢出相关

      依赖pwntools

      • cyclic 200

        生成200位溢出字符

      • cyclic -l ‘AwAA’

        计算栈溢出偏移量

  • r2

    aka. radare2

    • aa

      analyze all

    • afl

      show functions

    • s main

      select main function.

    • pdf

      print selected function’s debug info