Я использую ghex для изменения адреса памяти. Я хочу изменить вызов в основной функции вместо вызова 1149, я хочу вызвать 1166. Каково шестнадцатеричное значение 0000000000001149? так что могу заменить. Есть идеи?
0000000000001149 <ааа>:
1149: 55 push %rbp
114a: 48 89 e5 mov %rsp,%rbp
114d: 48 8d 05 b0 0e 00 00 lea 0xeb0(%rip),%rax # 2004 <_IO_stdin_used+0x4>
1154: 48 89 c7 mov %rax,%rdi
1157: e8 d4 fe ff ff call 1030 <puts@plt>
115c: bf 01 00 00 00 mov $0x1,%edi
1161: e8 da fe ff ff call 1040 <exit@plt>
0000000000001166 <bbb>:
1166: 55 push %rbp
1167: 48 89 e5 mov %rsp,%rbp
116a: 48 8d 05 a8 0e 00 00 lea 0xea8(%rip),%rax # 2019 <_IO_stdin_used+0x19>
1171: 48 89 c7 mov %rax,%rdi
1174: e8 b7 fe ff ff call 1030 <puts@plt>
1179: bf 02 00 00 00 mov $0x2,%edi
117e: e8 bd fe ff ff call 1040 <exit@plt>
0000000000001183 <основной>:
1183: 55 push %rbp
1184: 48 89 e5 mov %rsp,%rbp
1187: 48 83 ec 10 sub $0x10,%rsp
118b: 89 7d fc mov %edi,-0x4(%rbp)
118e: 48 89 75 f0 mov %rsi,-0x10(%rbp)
1192: b8 00 00 00 00 mov $0x0,%eax
1197: e8 ad ff ff ff call 1149 <aaa>
119c: b8 00 00 00 00 mov $0x0,%eax
11a1: e8 c0 ff ff ff call 1166 <bbb>
11a6: b8 00 00 00 00 mov $0x0,%eax
11ab: c9 leave
11ac: c3 ret
11ad: 0f 1f 00 nopl (%rax)
Значения, следующие за e8
в инструкциях call
, являются смещениями, поэтому, чтобы изменить вызов по адресу 1197 на call 1166
, вам придется изменить байт по адресу 1198 с ad
на ca
. Это потому, что 119c
(адрес после инструкции вызова) + ffffffca
(то же самое, что - 36
в арифметике с дополнением до 2) = 1166
.
Большое спасибо работает идеально. У меня есть другая помощь (СМ. ВЫШЕ), пожалуйста, посмотрите на нее, если можете. очень ценю это
Я думаю, вам нужно сделать так, чтобы гекс в строке, начинающейся с 1197, совпадал с гексом в строке, начинающейся с 11a1. Значение справа от
e8
— это символ/адрес перемещения, а не необработанный шестнадцатеричный адрес вызываемой функции.