cubecube

joploc/jopret メモ

Apr 20th, 2016
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. joploc/jopret の目的は、x29(FPレジスタ)の値を得ること。
  2.  
  3. E2363 26.1.B.3.109 のカーネルを例に挙げる。
  4.  
  5. ffffffc00016e2c0 do_sync_read
  6. ffffffc00017cb54 sys_fcntl
  7.  
  8. 例えば上記の時、do_sync_read + 0x6c = 0xffffffc00016e32c の辺りは、
  9.  
  10. ffffffc00016e32c: f9401004 ldr x4, [x0,#32]
  11. ffffffc00016e330: 910123a0 add x0, x29, #0x48
  12. ffffffc00016e334: d63f0080 blr x4
  13.  
  14. となっていて、私はここを「joploc」としてみた。
  15. ただ、この「形」が重要であって、この形になっていればjoplocはここじゃなくても良い。
  16. Cプログラムで言うと、
  17.  
  18. fp = fcntl(dev, F_SETFL, MMAP_START);
  19.  
  20. この命令によってカーネルのjoplocに侵入出来る。
  21.  
  22. さて、iovyrootのソース、preparejop関数に
  23.  
  24. addr[4] = jopret;
  25.  
  26. とあるが、addr配列の先頭アドレスは結論から言うとjoploc侵入時点でx0レジスタに入っている。
  27. (厳密に言うとaddr = MMAP_STARTで、上記fcntl第3引数のMMAP_STARTがx0レジスタに入る。)
  28. addr配列は1個当たり64bit(8バイト)なので、
  29. addr[4]のアドレスはaddrの先頭 + (8バイト x 4)となる。つまり x0 + 32。
  30. [x0,#32]というのは、x0 + 32の中身を表すので、
  31.  
  32. ldr x4, [x0,#32]
  33.  
  34. これでまずx4にjopretが入る。
  35.  
  36. add x0, x29, #0x48
  37.  
  38. これはx29に0x48を足してx0に入れるという命令。
  39.  
  40. blr x4
  41.  
  42. これはx4に飛ぶよ、ということ。つまりjopretに飛ぶ。
  43. jopretに飛ぶとどうなるかというと、(詳しいことは分からないが)x0の値を持ったままCのプログラムに帰ってこれる。
  44. すなわち、先ほどの
  45.  
  46. fp = fcntl(dev, F_SETFL, MMAP_START);
  47.  
  48. これの「fp」にx0の値が入ってくる。
  49.  
  50. x0にはx29 + 0x48が入ってるので、言い換えるとx0から0x48を引けば、欲しかったx29の値になる、というわけ。
  51. (ただ、0x48程度の誤差は最終的に無視できてしまうので、いちいち0x48を引くことはせず、そのままfpとして使ってる(^_^;)
  52.  
  53. jopretはというと、sys_fcntl + 0x214 = 0xffffffc00017cd68 に指定しているが、この辺りは、
  54.  
  55. ffffffc00017cd58: f9405001 ldr x1, [x0,#160]
  56. ffffffc00017cd5c: b4ffff61 cbz x1, 0xffffffc00017cd48
  57. ffffffc00017cd60: 2a1603e0 mov w0, w22
  58. ffffffc00017cd64: d63f0020 blr x1
  59.  
  60. jopret
  61. ffffffc00017cd68: 93407c13 sxtw x19, w0
  62. ffffffc00017cd6c: 350012f3 cbnz w19, 0xffffffc00017cfc8
  63. ffffffc00017cd70: 17fffff6 b 0xffffffc00017cd48
  64.  
  65. こんな感じになっていて、jopretはどうやらsys_fcntlのこの場所じゃないといけないらしい。
  66. いくつかの機種のカーネルを見てみたが、(0xffffffc0~みたいなアドレスを除いて)sys_fcntl + 0x214の辺りは必ずこの形になっていたので、
  67. とりあえずここをjopretにすれば良さそうだ。
Add Comment
Please, Sign In to add comment