Переполнение буфера в Sprintf - регистр RIP содержит мусорные данные - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь использовать функцию 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 байта, которые делают мой адрес недействительным?

Заранее спасибо

...