读了
有感就瞎写这个笔记
实践就用这个代码:
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 就能任意写高地址上的东西