Я пытаюсь использовать функцию sprintf c в моей программе, которая используется следующим образом:
char line[512];
sprintf(line,"[%s]", UserCommand);
Как вы можете видеть, строка может быть использована и вызвать что-то еще. Я нашел, как изменить регистр rbp, но когда дело доходит до регистра RIP, я могу изменить его с помощью "0xFFFF7FFFEBFF8C10" , но я не смог с "0x00007FFFEBFF8C10" , первые 2 байта "00 00 "заменяются на 0x2D5D (]) , который становится 0x2D5D7FFFEBFF8C10 . Этот адрес не может привести меня к моему буферу, где находится мой произвольный код.
Стек $ rsp-100:
0x7fffebff8d94: 0xd23148f6 0x3bc08348 0xebe8050f 0x2fffffff
0x7fffebff8da4: 0x2f6e6962 0x4168732f 0x41414141 0x41414141
0x7fffebff8db4: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffebff8dc4: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffebff8dd4: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffebff8de4: 0xffffffff 0x41414141 0x0000155a 0x41414141
0x7fffebff8df4: 0x41414141 0xebff8c10 0x205d7fff 0x00000000
0x7fffebff8e04: 0x00000000 0x00bd5760 0x00000000 0x00000000
Backtrace в GDB:
0 0x00000000004093a0 in ProcessCmd (Ctx=40, Connect=27, Msg=0x7fffebff9e32 '\220' <repeats 200 times>..., Len=522)
at /home/sam/srv/cmd/proc.c:305
1 0x205d7fffebff8c10 in ?? ()
2 0x0000000000000000 in ?? ()
Регистрация:
info r
rax 0xffffffff 4294967295
rbx 0x7fffebfff700 140737152808704
rcx 0x7ffff78cb1fd 140737346580989
rdx 0x919f40 9543488
rsi 0x0 0
rdi 0x919f40 9543488
rbp 0x4141414141414141 0x4141414141414141
rsp 0x7fffebff8df8 0x7fffebff8df8
r8 0x0 0
r9 0x29 41
r10 0x11 17
r11 0x0 0
r12 0x1 1
r13 0x7fffebfff9c0 140737152809408
r14 0x7fffebfff700 140737152808704
r15 0x0 0
rip 0x4093a0 0x4093a0 <ProcessCmd+407>
eflags 0x10202 [ IF RF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
Я хочу знать, можно ли это использовать или нет?
Есть ли способ? иметь действительный канонический адрес в регистре RIP и удалить 2 байта, которые делают мой адрес недействительным?
Заранее спасибо