Я заставил оболочку работать при переполнении буфера, добавив 8-байтовое дополнение, гаджет (pop rdi; ret), адрес, указывающий на «/bin/sh», и адрес system() в стеке.
Проблема возникла, когда я отправил «/bin/ ш" в полезной нагрузке раньше всех остальных полезные данные и попытался выполнить system() с этим адресом в rdi.
Код: Выделить всё
Breakpoint 2.1, __libc_system (line=0x7ffff7dcb42f "/bin/sh") at ../sysdeps/posix/system.c:202
202 in ../sysdeps/posix/system.c
(gdb) i r
rax 0x1 1
rbx 0x7fffffffdae8 140737488345832
rcx 0x7ffff7d1c574 140737351107956
rdx 0x0 0
rsi 0x4052a0 4215456
rdi 0x7ffff7dcb42f 140737351824431
rbp 0x0 0x0
rsp 0x7fffffffd578 0x7fffffffd578
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x202 514
r12 0x1 1
r13 0x0 0
r14 0x0 0
r15 0x7ffff7ffd000 140737354125312
rip 0x7ffff7c58740 0x7ffff7c58740
eflags 0x202 [ IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
fs_base 0x7ffff7fa1740 140737353750336
gs_base 0x0 0
(gdb) c
Continuing.
[Detaching after vfork from child process 26176]
$ exit
Код: Выделить всё
Breakpoint 2.1, __libc_system (line=0x7fffffffd530 "/bin/sh") at ../sysdeps/posix/system.c:202
warning: 202 ../sysdeps/posix/system.c: No such file or directory
(gdb) i r
rax 0x1 1
rbx 0x7fffffffdae8 140737488345832
rcx 0x7ffff7d1c574 140737351107956
rdx 0x0 0
rsi 0x4052a0 4215456
rdi 0x7fffffffd530 140737488344368
rbp 0x0 0x0
rsp 0x7fffffffd578 0x7fffffffd578
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x202 514
r12 0x1 1
r13 0x0 0
r14 0x0 0
r15 0x7ffff7ffd000 140737354125312
rip 0x7ffff7c58740 0x7ffff7c58740
eflags 0x202 [ IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
fs_base 0x7ffff7fa1740 140737353750336
gs_base 0x0 0
(gdb) c
Continuing.
[Detaching after vfork from child process 26188]
Program received signal SIGSEGV, Segmentation fault.
Код: Выделить всё
execve("./venus_messaging", ["./venus_messaging"], 0x7fffffffdb40 /* 74 vars */) = 0
brk(NULL) = 0x405000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffff7fbd000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=100487, ...}) = 0
mmap(NULL, 100487, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ffff7fa4000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\243\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
fstat(3, {st_mode=S_IFREG|0755, st_size=2125328, ...}) = 0
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
mmap(NULL, 2170256, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffff7c00000
mmap(0x7ffff7c28000, 1605632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x28000) = 0x7ffff7c28000
mmap(0x7ffff7db0000, 323584, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b0000) = 0x7ffff7db0000
mmap(0x7ffff7dff000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1fe000) = 0x7ffff7dff000
mmap(0x7ffff7e05000, 52624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffff7e05000
close(3) = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffff7fa1000
arch_prctl(ARCH_SET_FS, 0x7ffff7fa1740) = 0
set_tid_address(0x7ffff7fa1a10) = 27271
set_robust_list(0x7ffff7fa1a20, 24) = 0
rseq(0x7ffff7fa2060, 0x20, 0, 0x53053053) = 0
mprotect(0x7ffff7dff000, 16384, PROT_READ) = 0
mprotect(0x403000, 4096, PROT_READ) = 0
mprotect(0x7ffff7ffb000, 8192, PROT_READ) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
munmap(0x7ffff7fa4000, 100487) = 0
socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEPORT, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(9080), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 3) = 0
fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(0x88, 0), ...}) = 0
getrandom("\x7d\xf5\xd8\xd7\xab\x38\xab\x28", 8, GRND_NONBLOCK) = 8
brk(NULL) = 0x405000
brk(0x426000) = 0x426000
write(1, "Listening on port 9080\n", 23Listening on port 9080
) = 23
accept(3, {sa_family=AF_INET, sin_port=htons(51520), sin_addr=inet_addr("127.0.0.1")}, [16]) = 4
getpeername(4, {sa_family=AF_INET, sin_port=htons(51520), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
write(1, "Accepted connection from 127.0.0"..., 35Accepted connection from 127.0.0.1
) = 35
sendto(4, "Welcome to the Venus messaging s"..., 80, 0, NULL, 0) = 80
recvfrom(4, "loveandbeauty\n", 1024, 0, NULL, NULL) = 14
sendto(4, "Access granted, you can now send"..., 108, 0, NULL, 0) = 108
write(1, "User authenticated.\n", 20User authenticated.
) = 20
recvfrom(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2048, 0, NULL, NULL) = 1081
write(1, "Message received:\n", 18Message received:
) = 18
write(1, "\n", 1
) = 1
sendto(4, "Message sent to the Venus space "..., 56, 0, NULL, 0) = 56
write(1, "Message acknowledgement sent.\n", 30Message acknowledgement sent.
) = 30
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ffff7c45320}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ffff7c45320}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
mmap(NULL, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7ffff7fb4000
rt_sigprocmask(SIG_BLOCK, ~[], [CHLD], 8) = 0
clone3({flags=CLONE_VM|CLONE_VFORK|CLONE_CLEAR_SIGHAND, exit_signal=SIGCHLD, stack=0x7ffff7fb4000, stack_size=0x9000}, 88) = 27284
munmap(0x7ffff7fb4000, 36864) = 0
rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
wait4(27284, $ exit
[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 27284
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ffff7c45320}, NULL, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ffff7c45320}, NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27284, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7974756100} ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)
Код: Выделить всё
execve("./venus_messaging", ["./venus_messaging"], 0x7fffffffdb40 /* 74 vars */) = 0
brk(NULL) = 0x405000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffff7fbd000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=100487, ...}) = 0
mmap(NULL, 100487, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ffff7fa4000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\243\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
fstat(3, {st_mode=S_IFREG|0755, st_size=2125328, ...}) = 0
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
mmap(NULL, 2170256, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffff7c00000
mmap(0x7ffff7c28000, 1605632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x28000) = 0x7ffff7c28000
mmap(0x7ffff7db0000, 323584, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b0000) = 0x7ffff7db0000
mmap(0x7ffff7dff000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1fe000) = 0x7ffff7dff000
mmap(0x7ffff7e05000, 52624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffff7e05000
close(3) = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffff7fa1000
arch_prctl(ARCH_SET_FS, 0x7ffff7fa1740) = 0
set_tid_address(0x7ffff7fa1a10) = 27492
set_robust_list(0x7ffff7fa1a20, 24) = 0
rseq(0x7ffff7fa2060, 0x20, 0, 0x53053053) = 0
mprotect(0x7ffff7dff000, 16384, PROT_READ) = 0
mprotect(0x403000, 4096, PROT_READ) = 0
mprotect(0x7ffff7ffb000, 8192, PROT_READ) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
munmap(0x7ffff7fa4000, 100487) = 0
socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3
setsockopt(3, SOL_SOCKET, SO_REUSEPORT, [1], 4) = 0
bind(3, {sa_family=AF_INET, sin_port=htons(9080), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 3) = 0
fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(0x88, 0), ...}) = 0
getrandom("\x3d\x1f\x1d\x36\x81\xf1\x5e\x11", 8, GRND_NONBLOCK) = 8
brk(NULL) = 0x405000
brk(0x426000) = 0x426000
write(1, "Listening on port 9080\n", 23Listening on port 9080
) = 23
accept(3, {sa_family=AF_INET, sin_port=htons(33584), sin_addr=inet_addr("127.0.0.1")}, [16]) = 4
getpeername(4, {sa_family=AF_INET, sin_port=htons(33584), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
write(1, "Accepted connection from 127.0.0"..., 35Accepted connection from 127.0.0.1
) = 35
sendto(4, "Welcome to the Venus messaging s"..., 80, 0, NULL, 0) = 80
recvfrom(4, "loveandbeauty\n", 1024, 0, NULL, NULL) = 14
sendto(4, "Access granted, you can now send"..., 108, 0, NULL, 0) = 108
write(1, "User authenticated.\n", 20User authenticated.
) = 20
recvfrom(4, "\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2"..., 2048, 0, NULL, NULL) = 1081
write(1, "Message received:\n", 18Message received:
) = 18
write(1, "\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2\2"..., 1024/bin/sh
) = 1024
sendto(4, "Message sent to the Venus space "..., 56, 0, NULL, 0) = 56
write(1, "Message acknowledgement sent.\n", 30Message acknowledgement sent.
) = 30
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ffff7c45320}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ffff7c45320}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
mmap(NULL, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0x7ffff7fb4000
rt_sigprocmask(SIG_BLOCK, ~[], [CHLD], 8) = 0
clone3({flags=CLONE_VM|CLONE_VFORK|CLONE_CLEAR_SIGHAND, exit_signal=SIGCHLD, stack=0x7ffff7fb4000, stack_size=0x9000}, 88) = 27496
munmap(0x7ffff7fb4000, 36864) = 0
rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
wait4(27496, sh: 1: : not found
[{WIFEXITED(s) && WEXITSTATUS(s) == 127}], 0, NULL) = 27496
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ffff7c45320}, NULL, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ffff7c45320}, NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27496, si_uid=1000, si_status=127, si_utime=0, si_stime=0} ---
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7974756100} ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)
9 строк снизу вы можете увидеть ошибку sh: 1: : not Found вместо выполнения оболочки, как это было, когда я использовал строку, которая была в коде.
9 строк снизу вы можете увидеть ошибку sh: 1: : not Found вместо выполнения оболочки, как это было, когда я использовал строку, которая была в коде. p>
Единственная разница между этими двумя случаями заключается в том, где находится строка «/bin/sh». Почему это вызывает проблемы?
Будем очень признательны за любую помощь, спасибо!
Подробнее здесь: https://stackoverflow.com/questions/792 ... it-with-bi