/dev/zero
0x00뿐만 아니라 0x01과 0xFF 사이의 모든 바이트의 소스를 얻을 수 있도록 비트마스크를 어떻게 추가합니까 ?
답변1
다음 bash
코드는 표시된 바이트와 함께 사용하도록 설정되었습니다.바이너리. 하지만 쉽게 변경할 수 있습니다.오카트,소수또는16진수단순히 변경함으로써카디널리티 r
2
value 8
또는 별도로 설정하고 10
그에 따라 설정합니다. 16
b=
r=2; b=01111110
printf -vo '\\%o' "$(($r#$b))"; </dev/zero tr '\0' "$o"
편집하다- 그건 처리해모든 시리즈바이트 값:16진수 00-FF(아래에 00-7F를 쓸 때는 단일 바이트 UTF-8 문자만 고려합니다.)
예를 들어 4바이트만 필요한 경우(16진수 00-7F 범위의 UTF-8 'ASCII' 전용 문자), 파이프로 연결할 수 있습니다.머리:... | head -c4
출력(4자):
~~~~
8비트 형식으로 출력을 보려면 파이프 xxd
(또는 다른 형식) 로 파이프하십시오.1과 0바이트 덤프*):
예. b=10000000
다음으로 파이프됩니다.... | head -c4 | xxd -b
0000000: 10000000 10000000 10000000 10000000 ....
답변2
답변3
글쎄, 만약 당신이문자 그대로이를 달성하려면 다음을 사용할 수 있습니다.LD_PRELOAD 후크. 기본 아이디어는 C 라이브러리의 함수를 재정의하여 일반 함수 대신 사용하는 것입니다.
이것은 다시 작성하는 간단한 예입니다.읽다()이 함수는 출력 버퍼를 0x42로 XOR합니다.
#define _GNU_SOURCE
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <dlfcn.h>
#include <unistd.h>
static int dev_zero_fd = -1;
int open64(const char *pathname, int flags)
{
static int (*true_open64)(const char*, int) = NULL;
if (true_open64 == NULL) {
if ((true_open64 = dlsym(RTLD_NEXT, "open64")) == NULL) {
perror("dlsym");
return -1;
}
}
int ret = true_open64(pathname, flags);
if (strcmp(pathname, "/dev/zero") == 0) {
dev_zero_fd = ret;
}
return ret;
}
ssize_t read(int fd, void *buf, size_t count)
{
static ssize_t (*true_read)(int, void*, size_t) = NULL;
if (true_read == NULL) {
if ((true_read = dlsym(RTLD_NEXT, "read")) == NULL) {
perror("dlsym");
return -1;
}
}
if (fd == dev_zero_fd) {
int i;
ssize_t ret = true_read(fd, buf, count);
for (i = 0; i < ret; i++) {
*((char*)buf + i) ^= 0x42;
}
return ret;
}
return true_read(fd, buf, count);
}
순진한 구현은 우리가 읽는 모든 파일을 XOR 0x42로 처리하므로 바람직하지 않은 결과를 초래할 수 있습니다. 이 문제를 해결하기 위해 나도 전화를 끊었습니다.열려 있는()/dev/zero와 연관된 파일 설명자를 얻는 함수입니다. 그렇다면 우리는 우리의 일만읽다().fd == dev_zero_fd
용법:
$ gcc hook.c -ldl -shared -o hook.so
$ LD_PRELOAD=$(pwd)/hook.so bash #this spawns a hooked shell
$ cat /dev/zero
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
답변4
비트 마스크/0바이트 XOR을 시도하는 것은 의미가 없습니다. 그렇지 않습니까? 바이트를 가져와서 xor
0으로 처리하는 것은 아무 작업도 하지 않습니다.
필요한 바이트를 제공하는 루프를 만들고 이를 파이프나 명명된 파이프 뒤에 넣기만 하면 됩니다. 이는 문자 장치와 거의 동일하게 작동합니다(유휴 상태일 때 CPU 주기가 낭비되지 않음).
mkfifo pipe
while : ; do echo -n "a"; done > pipe &
슈퍼 최적화를 원할 경우 다음 C 코드를 사용할 수 있습니다.
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
char c = argc == 1+1 ? argv[1][0] : 'y';
char buff[BUFSIZ];
memset(buff, c, BUFSIZ);
for(;;){
write(1, buff, sizeof(buff));
}
}
컴파일 및 실행
$ CFLAGS=-O3 make loop
./loop "$the_byte_you_want" > pipe
성능 시험:
./loop 1 | pv -a >/dev/null
2.1GB/초내 컴퓨터에서는 (보다 약간 빠릅니다 cat /dev/zero | pv -a >/dev/null
.