19 Matching Annotations
  1. Nov 2022
    1. system calls like write fail silently

      write fail silently

    2. l->l_info[DT_JMPREL].d_un.d_ptr

      用来寻找got的位置

    3. LSB

      多字节序列中最小权重的位

    4. A ret instruction is not inserted at the end of the function body. It has a “cascading” property, where if a noreturn function is called at the end of another function, that function will also be marked as noreturn.

      noretern

    5. They’ll be at consistent offsets from each other! This is a byproduct of something known as mmap relativity

      ld 和 libc 的间距每次都相等

    1. .idO 文件是一个二叉树形式的数据库 .idl 文件包含描述每个程序字节 的标记 .narn文件包含与 IDA 的 Names 窗口 中显示的给定程序位置有关的索引信息 .til文件用于存储与一个给定数据库的本地类型定义有关的信息

      ida 产生的文件

    1. 在nx保护开启的情况下,我们依然可以通过mmap来申请出一段有读写执行权限的内存,通常mmap(target_addr,0x1000,7,34,0,0),这里target_addr需要页对齐也就是0x1000的整数倍,若不对齐,申请到的起始地址将不是target_addr。

      nx mmap 绕过

    1. ret指令用栈中的数据,修改IP的内容,返回代码段的第一条指令。相当于pop IP

      ret 和 call

    1. 用cyclic –l 0x62616164计算出偏移offset为112

      pwndbg计算溢出量

    1. ome versions of GLIBC uses movaps instructions to move data onto the stack in certain functions.

      movaps

    1. 在64位机中,%p 可以打印64位(理论上是64位,实际上目前是48位),%x 只能打印32位; 在打印指针变量的值(所指变量的地址)时,%p 能正确打印,%x 则只能打印后32位。

      %p %x

    1. python的open函数的第二个参数为打开的模式,如rb,rt,这包括两部分,前一个字母表示以只读模式打开(r=read),第二个字母表示将内容识别成什么数据。b表示是2进制数据,t表示是文本数据。

      open 函数

    1. 虚拟地址的最大宽度是52位,且内核虚拟地址空间和用户虚拟地址空间的宽度相同,均为最大52位宽;不过更常用的位宽是48位

      arm64虚拟内存寻址48位

    1. 理解一下,字符串偏移7,所以payload为got偏移+%7$s,这边用’s而不是’p’,在于got表记录内容也是个指针,%s直接解引用,返回内容:got表偏移+真实地址,所以 u32(sh.recv()[4:8])

      泄露got

    1. 1.直接在.got.plt 节中拿到地址,并跳转2.当 .got.plt 没有所需地址的时,触发「链接器」去找到所需地址,并填充到.got.plt中,然后跳转

      plt作用

    1. 动态链接时,一个程序PLT表中的内容始终不变,仅在程序加载时修改GOT表中的内容。PLT表中的每个表项指向对应函数在GOT表中的地址(偏移),每次加载程序都相同。程序加载后GOT表中的每个表项保存的是函数在共享区的绝对地址,每次加载都不相同。

      got plt 加载

    1. 顺便提一下,golang是比较安全的,它会先读入一定数据,然后把数据根据size拷贝给对应地址,所以只要size不出什么问题,基本不会存在溢出的。 我们要走到这个漏洞点,就需要先打通前面的Bulls and Cows猜数游戏,在之后给的菜单中选择Exit,然后读入一串rop链,走execve()来getshell即可。

      go pwn的思路。

    1. 64 位中只有 fini_array [0] ,没有 fini_array [1] ,也就是只能运行写入 fini_array 一次,然后就正常退出了。无法像静态编译那样重复调用。

      fini_array利用,动态静态区别