读了
有感就瞎写这个笔记
实践就用这个代码:
1  | //arr.c  | 
我编译好的:
1  | git clone https://github.com/zero-MK/arrOF  | 
编译运行:
1  | mk at ubuntu in ~/disk/CTF/pwn/temp  | 
至于为什么会这样请看:
gdb 载入
反汇编 main 函数:
1  | gdb-peda$ disassemble main  | 
看到了吗
1  | 0x000000000040059e <+8>: mov QWORD PTR [rbp-0x8],0xffffffffffffffff  | 
c code 就是 int minus_one = -1;
数组元素在栈中的布局:
1  | 低地址  | 
现在知道
数组下标在:[rbp - 0x20 - 0x10](0x7fffffffda60)
我们输入 1
看到 stack 上的内容
1  | 00:0000│ rsp 0x7fffffffda60 —▸ 0x7fffffffda8e ◂— 0x400620ffff  | 
数组的内容存在:[rbp - 0x20](0x7fffffffda70)
1  | gdb-peda$ p $rbp-0x20  | 
寻找数组的元素,rbp - 0x24  是我们的输入  i  
1  | 0x4005f8 <main+98> mov eax, dword ptr [rbp - 0x24]  | 
可以看出 rbp-0x20就是我们数组的首元素的位置,我们输入 0 相当于  arr[0]  取  rbp + 0 - 0x20   
1  | gdb-peda$ set $eax = 0  | 
当我们输入 -1 时
stack 上的内容:
1  | 00:0000│ rsp 0x7fffffffda60 —▸ 0x7fffffffda8e ◂— 0x400620ffff  | 
1  | gdb-peda$ p $eax  | 
[rbp + rax - 0x20]  就变成了 [rbp + 0xffffffff - 0x20] 
读到的是 [rbp + 0xffffffff - 0x20]
rax 的值(低 16 位,也就是 eax,因为是  mov    eax, dword ptr [rbp - 0x24]  )是可控的
如果精心构造 payload 就能任意读高地址的东西
如果现在是一个 scanf 就能任意写高地址上的东西